| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | BOI 2018 - Love Polygon | 100 (p) | 2.0s | 512M |
| 2 | BOI 2018 - Martian DNA | 100 (p) | 2.0s | 512M |
| 3 | BOI 2018 - Worm Worries | 100 (p) | 15.0s | 512M |
Như chúng ta đều biết, những bộ phim truyền hình dài tập có nhiều nhân vật có thể dẫn đến những chuyện tình vô cùng rắc rối. Trong một bộ phim có \(N\) nhân vật. Mỗi nhân vật yêu đúng một nhân vật, có thể là chính mình. Hai nhân vật khác nhau được gọi là một cặp đôi khi và chỉ khi họ yêu nhau.
Một kiểu rắc rối đặc biệt được gọi là “đa giác tình yêu”. Từ ba nhân vật trở lên tạo thành một đa giác tình yêu nếu người thứ nhất yêu người thứ hai, người thứ hai yêu người thứ ba, cứ như vậy, và người cuối cùng yêu người thứ nhất.
Một cuộc khảo sát gần đây cho thấy khán giả đã chán những chuyện tình rắc rối này và muốn xem điều gì đó lãng mạn hơn. Vì vậy, người ta quyết định bắn những mũi tên tình yêu vào một số nhân vật để tất cả mọi người đều có đôi. Khi bắn một mũi tên tình yêu vào một nhân vật, bạn có thể thay đổi người mà nhân vật đó yêu thành bất kỳ nhân vật nào bạn chọn.
Cần ít nhất bao nhiêu mũi tên tình yêu để tất cả mọi người đều có đôi?
Dòng đầu tiên chứa số nguyên \(N\), là số nhân vật. Mỗi dòng trong \(N\) dòng tiếp theo chứa hai tên \(s\) và \(t\) cách nhau bởi một dấu cách, cho biết nhân vật tên \(s\) ban đầu yêu nhân vật tên \(t\).
In ra một số nguyên: số mũi tên tình yêu ít nhất cần dùng để tất cả mọi người đều có đôi. Nếu không thể làm được, in ra -1.
Điểm của một lần nộp là tổng điểm các nhóm đạt được. Điểm cuối cùng là điểm cao nhất của một lần nộp.
Nhóm 1 (21 điểm): \(2 \le N \le 20\).
Ví dụ 1
8
leonard emmy
ada emmy
isaac leonard
emmy pierre
pierre bernhard
bernhard emmy
sofia karl
karl sofia
3
Ví dụ 2
4
a c
b c
c d
d d
3
Ví dụ này thỏa mãn ràng buộc của nhóm 3 và có nhiều phương án tối ưu. Một phương án là bắn mũi tên tình yêu vào a, b và d, khiến họ lần lượt yêu b, a và c.
Ví dụ 3
3
rocky scarlet
scarlet patrick
patrick rocky
-1
Đây là một tam giác tình yêu. Dù bắn bao nhiêu mũi tên tình yêu, vẫn luôn có một người không có đôi.
Baltic Olympiad in Informatics 2018, ngày thi thứ nhất.
Như bạn có thể đã biết, DNA của con người có thể được biểu diễn bằng một xâu dài trên bảng chữ cái gồm bốn ký hiệu A, C, G, T. Mỗi ký hiệu biểu thị một loại bazơ nitơ khác nhau, lần lượt là adenine, cytosine, guanine và thymine.
Tuy nhiên, với người sao Hỏa thì mọi thứ hơi khác. Nghiên cứu trên người sao Hỏa mới nhất mà NASA bắt được cho thấy DNA của họ có tới \(K\) loại bazơ nitơ khác nhau! Vì vậy, DNA của người sao Hỏa có thể được biểu diễn bằng một xâu trên bảng chữ cái gồm \(K\) ký hiệu.
Một nhóm nghiên cứu muốn khai thác DNA của người sao Hỏa trong các ứng dụng trí tuệ nhân tạo đã yêu cầu lấy một đoạn liên tiếp duy nhất của một xâu DNA. Với \(R\) loại bazơ nitơ, họ chỉ định số lượng tối thiểu của từng loại cần có trong mẫu.
Bạn cần tìm đoạn con ngắn nhất của xâu DNA thỏa mãn các yêu cầu đó.
Dòng đầu tiên chứa ba số nguyên \(N\), \(K\) và \(R\), lần lượt là tổng độ dài của xâu DNA, số loại bazơ nitơ và số loại mà các nhà nghiên cứu yêu cầu một số lượng tối thiểu.
Dòng thứ hai chứa \(N\) số nguyên cách nhau bởi dấu cách, biểu diễn toàn bộ xâu DNA. Số nguyên thứ \(i\), ký hiệu là \(D_i\), cho biết loại bazơ nitơ ở vị trí thứ \(i\). Các loại bazơ được đánh số từ \(0\) đến \(K-1\). Mỗi loại xuất hiện ít nhất một lần trong xâu DNA.
Mỗi dòng trong \(R\) dòng tiếp theo chứa hai số nguyên \(B\) và \(Q\), lần lượt là một loại bazơ và số lượng tối thiểu cần có của loại đó. Không có loại bazơ nào được liệt kê nhiều hơn một lần trong \(R\) dòng này.
In ra một số nguyên là độ dài của đoạn con liên tiếp ngắn nhất thỏa mãn yêu cầu của các nhà nghiên cứu. Nếu không tồn tại đoạn con như vậy, in ra impossible.
Điểm của một lần nộp là tổng điểm các nhóm đạt được. Điểm cuối cùng là điểm cao nhất của một lần nộp.
Nhóm 1 (16 điểm): \(1 \le N \le 100\), \(R \le 10\).
Ví dụ 1
5 2 2
0 1 1 0 1
0 1
1 1
2
Có ba đoạn con độ dài \(2\) chứa đúng một bazơ loại \(0\) và một bazơ loại \(1\), lần lượt là 0 1, 1 0 và 0 1. Không có đoạn con độ dài \(1\) thỏa mãn, nên độ dài ngắn nhất là \(2\).
Ví dụ 2
13 4 3
1 1 3 2 0 1 2 0 0 0 0 3 1
0 2
2 1
1 2
7
Đoạn con tối ưu duy nhất là 1 3 2 0 1 2 0.
Ví dụ 3
5 3 1
1 2 0 1 2
0 2
impossible
Xâu DNA không có đủ bazơ loại \(0\).
Baltic Olympiad in Informatics 2018, ngày thi thứ nhất.
Bạn đang tìm một vị trí trong đất để đặt chú giun cưng Maximus. Bạn giới hạn việc tìm kiếm trong một vùng hình hộp có kích thước \(N \times M \times K\) xentimét, được chia thành một lưới ba chiều gồm các ô lập phương có thể tích một xentimét khối. Mỗi ô có tọa độ \((x,y,z)\) với \(1 \le x \le N\), \(1 \le y \le M\), \(1 \le z \le K\). Độ ẩm \(H[x,y,z]\) là một số nguyên từ \(1\) đến \(10^9\).
Maximus thích những nơi ẩm ướt. Hãy tìm một ô có độ ẩm không nhỏ hơn độ ẩm của cả sáu ô kề nó theo các trục, để chú không bò đi. Chính xác hơn, cần tìm một ô \((x,y,z)\) sao cho
Độ ẩm ngoài hình hộp được xem là \(0\). Độ ẩm trong hộp cố định từ trước và không phụ thuộc vào các phép đo. Bạn chỉ được đo độ ẩm nhiều nhất \(Q\) lần.
Phiên bản này sử dụng giao diện hàm C++17. Tải tệp đính kèm worm.h, khai báo #include "worm.h" và cài đặt hàm sau; không viết main:
struct WormPosition { int x, y, z; }; // Đã được định nghĩa trong worm.h.
WormPosition find_worm(int N, int M, int K, int Q);
Trình chấm gọi hàm một lần cho mỗi bộ dữ liệu. Ba tham số đầu là kích thước hình hộp, còn \(Q\) là số phép đo tối đa. Hàm trả về tọa độ đánh số từ 1 của một ô thỏa mãn điều kiện trên. Trả về kết quả không tốn truy vấn; ô kết quả không bắt buộc phải được đo trước đó.
Trình chấm cung cấp hàm sau trong worm.h:
int measure(int x, int y, int z);
Hàm trả về \(H[x,y,z]\). Mỗi lời gọi đều tính một truy vấn, kể cả khi hỏi lại cùng một ô. Tọa độ phải nằm trong hộp. Một lời gọi không hợp lệ hoặc vượt quá \(Q\) truy vấn làm bộ dữ liệu bị chấm sai ngay lập tức. Chương trình không cần xử lý giá trị -1 hay flush như giao thức tương tác cũ.
Chỉ dùng một luồng, phép tính và bộ nhớ C++ thông thường. Không đọc/ghi đầu vào/đầu ra, mở tệp, tạo tiến trình hoặc kiểm tra hệ thống. Chỉ gọi measure trong quá trình thực hiện find_worm, không gọi từ hàm khởi tạo biến toàn cục. Chi tiết và chương trình minh họa có trong tệp đính kèm API.md.
measure và tọa độ trả về đều phải nằm trong hình hộp.measure nhiều nhất \(Q\) lần.Mỗi nhóm chỉ có điểm khi tất cả các bộ dữ liệu trong nhóm đều đúng. Điểm của một lần nộp là tổng điểm các nhóm đạt được. Điểm cuối cùng là điểm cao nhất của một lần nộp.
Ví dụ 1
Giả sử trình chấm gọi find_worm(3, 1, 1, 3) và ba ô có độ ẩm lần lượt là \(10\), \(14\), \(13\).
measure(3, 1, 1) trả về 13
measure(2, 1, 1) trả về 14
measure(1, 1, 1) trả về 10
find_worm trả về {2, 1, 1}
Vì \(14\) không nhỏ hơn hai giá trị kề nó là \(10\) và \(13\), ô \((2,1,1)\) phù hợp cho Maximus. Chương trình đã dùng ba truy vấn, đúng bằng \(Q=3\).
Baltic Olympiad in Informatics 2018, ngày thi thứ nhất.