| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2023 - The Last Battle | 100 (p) | 2.0s | 1G |
| 2 | JOI 2023 - Security Guard | 100 (p) | 3.0s | 1G |
| 3 | JOI 2023 - Bitaro's Travel | 100 (p) | 2.0s | 1G |
JOICup là chương trình truyền hình giải trí nổi tiếng của đài JOI. Chương trình đã bước vào vòng chung kết, nơi diễn ra trò chơi truyền tin. Chỉ một đội vượt qua vòng đầu được tham gia trò chơi; đội gồm hai người chơi Anna và Bruno.
Trong trò chơi, thông tin được truyền bằng một bảng gồm \(8\times8\) ô. Các hàng và các cột đều được đánh số từ \(0\) đến \(7\).
Anna và Bruno ở trong hai phòng riêng biệt, cách ly với nhau. Họ thực hiện \(Q\) thử thách. Thử thách thứ \(i\) (\(1\le i\le Q\)) diễn ra như sau:
A, B. Ban đầu, tất cả các ô đều màu trắng.Luồng trao đổi trong mỗi thử thách được minh họa dưới đây. Các số từ \(1\) đến \(6\) trong hình tương ứng với sáu bước vừa mô tả.
Hãy viết các chương trình cài đặt chiến lược của Anna và Bruno để thắng trò chơi truyền tin. Cách tính điểm được mô tả trong phần Phân nhóm.
Trên hệ thống này, cần nộp một tệp battle.cpp chứa cả hai hàm Anna và Bruno, có chỉ thị #include "battle.h". Các giao diện và cách tính điểm bên dưới không thay đổi so với đề gốc.
Trong tệp battle.cpp, cài đặt chiến lược của Anna bằng hàm:
void Anna(int X, int Y, int N, std::string S);
Hàm được gọi \(Q\) lần. Lần gọi thứ \(i\) (\(1\le i\le Q\)) tương ứng với các bước \(1,2,3\) của thử thách thứ \(i\). Các tham số X, Y, N, S lần lượt là \(X_i,Y_i,N_i,S_i\) ghi trên thẻ Anna nhận ở bước \(1\).
Trong mỗi lần gọi Anna, phải gọi hàm sau đúng \(49\) lần, mỗi ô có hàng khác X và cột khác Y đúng một lần:
void Paint(int a, int b, int c);
a, b là số hàng và số cột của ô Anna tô. Phải có \(0\le a\le7\), \(0\le b\le7\), \(a\ne X\), \(b\ne Y\); nếu không, bị chấm Wrong Answer [1].c biểu diễn màu: 0 là xanh lam, 1 là đỏ. Phải có \(0\le c\le1\); nếu không, bị chấm Wrong Answer [2].Paint nhiều hơn một lần với cùng cặp (a, b), bị chấm Wrong Answer [3].Anna kết thúc, nếu số lần gọi Paint khác \(49\), bị chấm Wrong Answer [4].Trong cùng tệp battle.cpp, cài đặt chiến lược của Bruno bằng hàm:
std::string Bruno(int N, std::vector<std::vector<int>> T);
Hàm được gọi sau mỗi lần Anna tô xong bảng, tổng cộng \(Q\) lần. Lần gọi thứ \(i\) (\(1\le i\le Q\)) tương ứng với các bước \(5,6\) của thử thách thứ \(i\).
N là số nguyên \(N_i\) trên thẻ Bruno nhận ở bước \(5\).T là mảng hai chiều kích thước \(8\times8\) mô tả bảng Bruno nhận ở bước \(5\). Ô hàng a, cột b (\(0\le a,b\le7\)) màu xanh lam nếu T[a][b] = 0, màu đỏ nếu T[a][b] = 1.Wrong Answer [5].A hoặc B; nếu không, bị chấm Wrong Answer [6].Có thể cài đặt hàm phụ trợ hoặc sử dụng biến toàn cục. Tệp nộp sẽ được liên kết với trình chấm thành một tệp thực thi. Tất cả biến toàn cục và hàm phụ trợ phải được khai báo trong không gian tên vô danh để tránh xung đột với trình chấm; các phần cài đặt của Anna và Bruno trong cùng tệp cũng phải tránh trùng tên. Khi chấm, tệp thực thi chạy thành hai tiến trình, một cho Anna và một cho Bruno; hai tiến trình không thể chia sẻ biến toàn cục.
Chương trình không được sử dụng đầu vào chuẩn, đầu ra chuẩn hoặc giao tiếp với các tệp khác bằng bất kỳ cách nào. Có thể ghi thông tin gỡ lỗi ra đầu ra lỗi chuẩn.
Gói tệp hỗ trợ một tệp nộp trong phần đính kèm chứa trình chấm mẫu chính thức grader.cpp, tệp mẫu battle.cpp, các tệp khai báo battle.h, Anna.h, Bruno.h, và hai đầu vào mẫu sample-01.txt, sample-02.txt. Giữ các tệp trong cùng thư mục rồi biên dịch bằng lệnh:
g++ -std=gnu++17 -O2 -o grader grader.cpp battle.cpp
Cũng có thể chạy compile.sh trong gói hỗ trợ. Nếu biên dịch thành công, tệp thực thi grader được tạo ra.
Trình chấm thật khác trình chấm mẫu. Đặc biệt, Bitaro không nhất thiết chọn màu cho các ô một cách ngẫu nhiên. Trình chấm mẫu chạy trong một tiến trình, đọc đầu vào chuẩn và ghi kết quả ra đầu ra chuẩn.
Trình chấm mẫu đọc đầu vào chuẩn theo định dạng:
Q
X_1 Y_1 N_1 S_1
X_2 Y_2 N_2 S_2
...
X_Q Y_Q N_Q S_Q
Trình chấm mẫu ghi thông tin sau ra đầu ra chuẩn:
Accepted: 28. Định nghĩa \(L^*\) nằm trong phần Phân nhóm.Wrong Answer [1].Nếu chương trình đồng thời thỏa mãn nhiều điều kiện bị chấm sai, trình chấm mẫu chỉ báo một loại lỗi.
Trong trình chấm mẫu, các màu Bitaro chọn được xác định bằng số giả ngẫu nhiên và không thay đổi giữa các lần chạy với cùng hạt giống. Có thể thay đổi hạt giống bằng đối số nguyên đầu tiên, chẳng hạn:
./grader 2023
A, B.Bài này tính điểm theo độ dài truyền tin, không chia thành các nhóm cộng điểm độc lập.
Nếu chương trình bị bất kỳ lỗi Wrong Answer [1] đến Wrong Answer [6], hoặc bất kỳ lỗi thực thi nào như quá thời gian (TLE), quá bộ nhớ (MLE), kết thúc bất thường, v.v. trong bất kỳ bộ kiểm thử nào, điểm của toàn bài là \(0\), bất kể kết quả thắng các thử thách trong những bộ kiểm thử khác.
Nếu không có các lỗi trên, trong mỗi bộ kiểm thử, xét giá trị lớn nhất \(L\) sao cho Anna và Bruno thắng tất cả thử thách có \(N_i\le L\). Nếu thắng tất cả thử thách trong bộ kiểm thử đó, đặt \(L=43\). Gọi \(L^*\) là giá trị nhỏ nhất của các giá trị \(L\) trên tất cả bộ kiểm thử của bài. Điểm được tính theo bảng sau:
| \(L^*\) | Điểm |
|---|---|
| 0 | 0 |
| 1 | 5 |
| 2 | 8 |
| 3 | 10 |
| 4 | 11 |
| 5 | 13 |
| 6 | 14 |
| 7 | 16 |
| 8 | 18 |
| 9 | 19 |
| 10 | 21 |
| 11 | 22 |
| 12 | 24 |
| 13 | 26 |
| 14 | 27 |
| 15 | 29 |
| 16 | 30 |
| 17 | 32 |
| 18 | 34 |
| 19 | 35 |
| 20 | 37 |
| 21 | 38 |
| 22 | 40 |
| 23 | 42 |
| 24 | 43 |
| 25 | 45 |
| 26 | 46 |
| 27 | 48 |
| 28 | 50 |
| 29 | 51 |
| 30 | 53 |
| 31 | 54 |
| 32 | 56 |
| 33 | 57 |
| 34 | 59 |
| 35 | 60 |
| 36 | 62 |
| 37 | 65 |
| 38 | 68 |
| 39 | 71 |
| 40 | 74 |
| 41 | 77 |
| 42 | 84 |
| 43 | 100 |
Ví dụ 1
Dữ liệu vào của trình chấm mẫu:
2
0 0 1 B
5 7 8 AAAABBBB
Lời gọi và giá trị trả về
Tham số T trong các lời gọi Bruno được lược bỏ, giống bảng minh họa của đề.
| Lời gọi phía Anna | Lời gọi phía Bruno | Giá trị Bruno trả về |
|---|---|---|
Anna(0, 0, 1, "B") |
||
Paint(1, 1, 0) |
||
Paint(1, 2, 1) |
||
| ... | ||
Paint(7, 7, 1) |
||
Bruno(1, ...) |
||
"B" |
||
Anna(5, 7, 8, "AAAABBBB") |
||
Paint(0, 0, 1) |
||
Paint(0, 1, 1) |
||
| ... | ||
Paint(7, 6, 0) |
||
Bruno(8, ...) |
||
"AAAABBBB" |
Giải thích
Có \(Q=2\) thử thách:
Chẳng hạn, nếu gọi Paint(0, 2, 1) trong thử thách đầu tiên, chương trình bị chấm Wrong Answer [1] vì chỉ định một ô ở hàng \(0\).
Ví dụ 2
Dữ liệu vào của trình chấm mẫu:
30
3 1 1 A
1 4 1 A
6 6 2 AA
1 1 2 BB
3 1 3 BAB
7 4 3 AAB
6 4 4 BAAB
6 7 4 BABA
3 3 5 BABBA
1 5 5 ABBBA
4 3 6 ABBBBB
2 1 6 ABAAAA
6 0 7 AAABABA
6 6 7 BBABBAA
0 4 8 AABAABAB
2 1 8 AABBBBBA
2 0 9 BABABBAAA
1 5 9 BBAAABABB
6 7 10 BAAABAAABB
1 7 10 BBBBBBBABA
2 6 12 AABAABABABAB
3 4 15 BBAABAAAABABAAB
5 6 18 BAAAABBABABBBABBAB
7 0 22 BABBAABAAABBABBBBBBABA
2 0 26 AAAABBABBAAAAABABABBAABAAA
0 7 30 AAABBBAAABAABBBBAABBAAABBBABBB
2 7 34 BABAABBAABABBABAABBABBABAABBBBABBB
2 5 38 BBBBAABAABAABABABBBBBAAABBABAAABAAABBB
5 2 41 AABABBAAABBABAAAABBABABBAAAAAABBABBABBABA
1 0 43 AABBABBBBABABBBABBBBAAAAAABABAAABBBAABBAAAB
JOI 2022/2023 Spring Training, Contest 4, bài The Last Battle, tác giả 米田寛峻 và 米田優峻.
Bản dịch tiếng Việt và hình từ đề của JCIOI (Ủy ban Olympic Tin học Quốc tế Nhật Bản), theo giấy phép CC BY-SA 4.0.
Vương quốc JOI có \(N\) hòn đảo, đánh số từ \(1\) đến \(N\). Mỗi đảo có một mức độ mất an ninh; mức độ mất an ninh của đảo \(i\) (\(1\le i\le N\)) là \(S_i\).
Phương tiện đi lại chủ yếu giữa các đảo là tàu. Có \(M\) con tàu, đánh số từ \(1\) đến \(M\). Tàu \(j\) (\(1\le j\le M\)) nối đảo \(A_j\) với đảo \(B_j\) và có thể được điều động khi cần. Có thể đi từ một đảo bất kỳ đến bất kỳ đảo nào khác bằng cách đi một số tàu.
Vương quốc dự định bổ sung tàu mới. Với mỗi tàu mới, có thể tùy ý chọn cặp đảo mà tàu nối.
Một ngày nọ, một tàu đang neo đậu bị tấn công. Thủ tướng K quyết định bổ sung tàu mới và yêu cầu các tàu phải tuân theo điều kiện an ninh:
Do thuê bảo vệ tốn kém, cần giảm thiểu tổng số nhân viên bảo vệ được thuê. Có thể ngừng sử dụng các tàu đang hoạt động, miễn vẫn có thể đi giữa mọi cặp đảo.
Gọi \(k\) là số tàu mới được bổ sung. Ta tổ chức hoạt động của các tàu theo các bước:
Điều kiện: Với mọi cặp đảo \(u,v\) (\(1\le u,v\le N\)), phải có thể vận chuyển một hành khách từ đảo \(u\) đến đảo \(v\) bằng cách lặp lại các thao tác sau. Trong toàn bộ quá trình, điều kiện an ninh phải luôn được thỏa mãn.
Ngân sách chỉ cho phép bổ sung tối đa \(Q\) tàu mới. Với mỗi \(k\) từ \(0\) đến \(Q\), thủ tướng K muốn biết số nhân viên bảo vệ ít nhất cần thuê nếu bổ sung \(k\) tàu mới.
Cho thông tin về các đảo, tuyến hoạt động của các tàu và số tàu mới có thể bổ sung, hãy tính số nhân viên bảo vệ ít nhất cần thuê cho từng giá trị \(k\).
Đọc từ đầu vào chuẩn theo định dạng:
N M Q
S_1 S_2 ... S_N
A_1 B_1
A_2 B_2
...
A_M B_M
Xuất \(Q+1\) dòng ra đầu ra chuẩn. Dòng thứ \(k+1\) (\(0\le k\le Q\)) chứa số nhân viên bảo vệ ít nhất cần thuê khi bổ sung \(k\) tàu mới.
Mọi nhóm đều tuân theo các ràng buộc chung ở trên.
Ví dụ 1
4 3 0
2 1 3 2
1 2
2 3
3 4
7
Khi không bổ sung tàu mới, cần \(7\) nhân viên bảo vệ. Chẳng hạn, có thể bố trí ban đầu như sau:
Dưới đây minh họa việc vận chuyển hành khách trong hai trường hợp: từ đảo \(1\) đến đảo \(4\), và từ đảo \(3\) đến đảo \(2\).
Trong mỗi bảng, cột vị trí neo và cột số bảo vệ trên tàu lần lượt liệt kê thông tin của các tàu \(1,2,3\). Cột số bảo vệ trên đảo lần lượt liệt kê thông tin của các đảo \(1,2,3,4\).
Vận chuyển một hành khách từ đảo \(1\) đến đảo \(4\):
| Bước | Thao tác | Vị trí neo của tàu | Bảo vệ trên tàu | Bảo vệ trên đảo |
|---|---|---|---|---|
| Ban đầu | Chưa thực hiện thao tác | 2, 2, 4 | 2, 2, 3 | 0, 0, 0, 0 |
| 1 | Di chuyển tàu 1 từ đảo 2 đến đảo 1. | 1, 2, 4 | 2, 2, 3 | 0, 0, 0, 0 |
| 2 | Cho hành khách lên tàu 1. | 1, 2, 4 | 2, 2, 3 | 0, 0, 0, 0 |
| 3 | Di chuyển tàu 1 từ đảo 1 đến đảo 2. | 2, 2, 4 | 2, 2, 3 | 0, 0, 0, 0 |
| 4 | Cho một bảo vệ và hành khách rời tàu 1. | 2, 2, 4 | 1, 2, 3 | 0, 1, 0, 0 |
| 5 | Cho một bảo vệ và hành khách lên tàu 2. | 2, 2, 4 | 1, 3, 3 | 0, 0, 0, 0 |
| 6 | Di chuyển tàu 2 từ đảo 2 đến đảo 3. | 2, 3, 4 | 1, 3, 3 | 0, 0, 0, 0 |
| 7 | Cho hành khách rời tàu 2. | 2, 3, 4 | 1, 3, 3 | 0, 0, 0, 0 |
| 8 | Di chuyển tàu 3 từ đảo 4 đến đảo 3. | 2, 3, 3 | 1, 3, 3 | 0, 0, 0, 0 |
| 9 | Cho hành khách lên tàu 3. | 2, 3, 3 | 1, 3, 3 | 0, 0, 0, 0 |
| 10 | Di chuyển tàu 3 từ đảo 3 đến đảo 4. | 2, 3, 4 | 1, 3, 3 | 0, 0, 0, 0 |
| 11 | Cho hành khách rời tàu 3. | 2, 3, 4 | 1, 3, 3 | 0, 0, 0, 0 |
Vận chuyển một hành khách từ đảo \(3\) đến đảo \(2\):
| Bước | Thao tác | Vị trí neo của tàu | Bảo vệ trên tàu | Bảo vệ trên đảo |
|---|---|---|---|---|
| Ban đầu | Chưa thực hiện thao tác | 2, 2, 4 | 2, 2, 3 | 0, 0, 0, 0 |
| 1 | Cho một bảo vệ rời tàu 1. | 2, 2, 4 | 1, 2, 3 | 0, 1, 0, 0 |
| 2 | Cho một bảo vệ lên tàu 2. | 2, 2, 4 | 1, 3, 3 | 0, 0, 0, 0 |
| 3 | Di chuyển tàu 2 từ đảo 2 đến đảo 3. | 2, 3, 4 | 1, 3, 3 | 0, 0, 0, 0 |
| 4 | Cho hành khách lên tàu 2. | 2, 3, 4 | 1, 3, 3 | 0, 0, 0, 0 |
| 5 | Di chuyển tàu 2 từ đảo 3 đến đảo 2. | 2, 2, 4 | 1, 3, 3 | 0, 0, 0, 0 |
| 6 | Cho hành khách rời tàu 2. | 2, 2, 4 | 1, 3, 3 | 0, 0, 0, 0 |
Không thể thỏa mãn các điều kiện nếu chỉ thuê từ \(6\) bảo vệ trở xuống, nên xuất 7. Ví dụ này thỏa mãn ràng buộc của các nhóm \(2,3,4,5,6,7\).
Ví dụ 2
4 3 1
2 1 3 2
1 2
2 3
3 4
7
5
Nếu không bổ sung tàu mới, cần \(7\) bảo vệ như ở ví dụ \(1\). Nếu bổ sung \(1\) tàu mới, cần \(5\) bảo vệ. Chẳng hạn, có thể bố trí như sau:
Ví dụ này thỏa mãn ràng buộc của các nhóm \(5,6,7\).
Ví dụ 3
3 3 0
1 1 1
1 2
1 3
2 3
2
Khi không bổ sung tàu mới, cần \(2\) bảo vệ. Chẳng hạn, có thể bố trí như sau:
Ví dụ này thỏa mãn ràng buộc của các nhóm \(4,5,6,7\).
Ví dụ 4
8 7 0
2 2 2 2 2 2 2 2
1 2
2 3
3 4
4 5
5 6
6 7
7 8
14
Ví dụ này thỏa mãn ràng buộc của tất cả các nhóm.
Ví dụ 5
8 7 0
16 39 36 23 15 48 23 56
1 2
1 3
2 4
2 5
3 6
3 7
7 8
245
Ví dụ này thỏa mãn ràng buộc của các nhóm \(3,4,5,6,7\).
Ví dụ 6
10 13 4
314 159 265 358 979 323 846 264 338 327
1 2
1 4
2 3
2 5
3 6
4 5
4 7
5 6
5 8
6 9
7 8
8 9
9 10
3139
2901
2722
2567
2461
Ví dụ này thỏa mãn ràng buộc của các nhóm \(5,6,7\).
JOI 2022/2023 Spring Training, Contest 4, bài Security Guard, tác giả 戸髙空.
Bản dịch tiếng Việt từ đề của JCIOI (Ủy ban Olympic Tin học Quốc tế Nhật Bản), theo giấy phép CC BY-SA 4.0.
Thành phố JOI có một con đường rất dài, có thể xem như trục số thực. Mỗi vị trí trên đường được biểu diễn bằng một tọa độ thực. Dọc con đường có \(N\) điểm tham quan, đánh số từ \(1\) đến \(N\) theo thứ tự tọa độ tăng dần. Điểm tham quan thứ \(i\) (\(1\le i\le N\)) có tọa độ \(X_i\).
Bitaro sẽ ghé thăm tất cả các điểm tham quan. Vì phương châm sống của cậu là "tham lam", cậu lặp lại quy trình sau cho đến khi đã thăm hết:
Qua nhiều năm kinh nghiệm, Bitaro biết rằng quy trình này có thể khiến tổng quãng đường di chuyển dài hơn dự kiến. Tổng quãng đường phụ thuộc vào tọa độ xuất phát. Vì vậy, với mỗi tọa độ xuất phát trong \(Q\) lựa chọn \(S_1,S_2,\ldots,S_Q\), cậu muốn biết tổng quãng đường phải đi cho đến khi đã ghé thăm tất cả các điểm.
Cho thông tin về các điểm tham quan và các tọa độ xuất phát, hãy tính tổng quãng đường di chuyển của Bitaro với từng lựa chọn.
Đọc từ đầu vào chuẩn theo định dạng:
N
X_1 X_2 ... X_N
Q
S_1
S_2
...
S_Q
Xuất \(Q\) dòng ra đầu ra chuẩn. Dòng thứ \(j\) (\(1\le j\le Q\)) chứa tổng quãng đường Bitaro di chuyển nếu xuất phát tại tọa độ \(S_j\).
Mọi nhóm đều tuân theo các ràng buộc chung ở trên.
Ví dụ 1
5
0 5 6 7 9
1
7
15
Khi xuất phát tại tọa độ \(7\), Bitaro ghé thăm các điểm như sau:
Tổng quãng đường di chuyển là \(15\), nên xuất 15. Ví dụ này thỏa mãn ràng buộc của tất cả các nhóm.
Ví dụ 2
10
1 2 3 4 5 6 7 8 9 10
10
1
2
3
4
5
6
7
8
9
10
9
10
11
12
13
14
15
16
17
9
Ví dụ này thỏa mãn ràng buộc của các nhóm \(3,4\).
JOI 2022/2023 Spring Training, Contest 4, bài Bitaro's Travel, tác giả 米田寛峻 và 米田優峻.
Bản dịch tiếng Việt từ đề của JCIOI (Ủy ban Olympic Tin học Quốc tế Nhật Bản), theo giấy phép CC BY-SA 4.0.