| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOIG 2026 - Cheeses and Mice | 100 (p) | 2.0s | 1G |
| 2 | JOIG 2026 - Curry and Rice | 100 (p) | 2.0s | 1G |
| 3 | JOIG 2026 - Packing Snacks | 100 (p) | 2.0s | 1G |
| 4 | JOI 2026 - Voltage 2 | 100 (p) | 2.0s | 1G |
Có \(N\) miếng phô mai xếp thành một hàng trước hang chuột. Miếng thứ \(i\) tính từ đầu hàng có kích thước \(i\). Trong hang có \(M\) con chuột, đánh số từ \(1\) đến \(M\). Chuột \(j\) chỉ thích phô mai có kích thước ít nhất \(A_j\), với \(A_1<A_2<...<A_M\).
Trong mỗi ngày trong \(N\) ngày liên tiếp, các chuột lần lượt hành động theo thứ tự \(1,2,...,M\). Nếu chuột \(j\) tìm thấy một miếng còn trong hàng mà nó thích, nó chọn miếng gần đầu hàng nhất rồi đổi chỗ miếng đó với miếng ở đầu hàng. Nếu miếng đã ở đầu hàng hoặc không có miếng phù hợp, chuột không làm gì. Sau khi mọi chuột đã hành động, miếng ở đầu hàng được đưa vào hang và bị loại khỏi hàng.
Hãy xác định kích thước miếng phô mai được đưa vào hang ở từng ngày.
Dòng đầu gồm \(N,M\). Dòng thứ hai gồm \(A_1,A_2,...,A_M\).
In \(N\) dòng. Dòng thứ \(k\) là kích thước phô mai được đưa vào hang ở ngày \(k\).
Ví dụ 1
5 2
3 4
4
5
3
2
1
Ví dụ 2
3 1
2
2
3
1
JOIG 2025/2026 - Chung kết, Cuộc thi 3, bài Cheeses and Mice.
Tài liệu gốc của Japanese Committee for IOI được phát hành theo giấy phép CC BY-SA 4.0.
Aoi chuẩn bị \(N\) loại cà ri và \(M\) loại cơm. Loại cà ri \(i\) có \(A_i\) phần, loại cơm \(j\) có \(B_j\) phần. Một phần cà ri và một phần cơm tạo thành một suất cà ri cơm.
Mỗi con hải ly nhận đúng một suất, nhưng không có hai con nào được nhận cùng một loại cà ri cơm. Hai suất chỉ được coi là cùng loại khi cả loại cà ri lẫn loại cơm đều giống nhau. Hãy tìm số hải ly lớn nhất có thể nhận một suất từ nguyên liệu đã chuẩn bị.
Dòng đầu gồm \(N,M\). Dòng thứ hai gồm \(A_1,A_2,...,A_N\). Dòng thứ ba gồm \(B_1,B_2,...,B_M\).
In một số nguyên: số suất cà ri cơm lớn nhất có thể phục vụ.
Ví dụ 1
3 4
2 2 2
4 1 1 1
6
Ví dụ 2
3 4
4 2 4
1 4 3 1
8
Ví dụ 3
2 2
1 1000000000
1000000000 1
3
JOIG 2025/2026 - Chung kết, Cuộc thi 3, bài Curry and Rice.
Tài liệu gốc của Japanese Committee for IOI được phát hành theo giấy phép CC BY-SA 4.0.
Aoi có \(N\) chiếc bánh. Bánh \(i\) có loại \(A_i\) và kích thước \(C_i\). Cô phải chọn đúng \(M\) bánh để mang đến nhà Bitaro.
Bitaro có \(M\) túi. Túi \(j\) chứa được nhiều nhất một bánh có loại đúng bằng \(B_j\) và kích thước không vượt quá \(D_j\). Sau khi Aoi chọn bánh, Bitaro xếp chúng vào túi để nhận được nhiều bánh nhất. Ngược lại, Aoi biết mọi thông tin về túi và chọn \(M\) bánh để số bánh Bitaro cuối cùng nhận được là nhỏ nhất.
Hãy tìm số bánh Bitaro nhận được khi cả hai đều chơi tối ưu.
Dòng đầu gồm \(N,M,T\). Có \(N\) dòng tiếp theo, dòng \(i\) gồm \(A_i,C_i\). Có \(M\) dòng sau đó, dòng \(j\) gồm \(B_j,D_j\).
In một số nguyên: số bánh Bitaro nhận được.
Ví dụ 1
5 3 1
1 9
1 3
1 6
1 1
1 5
1 10
1 5
1 5
2
Ví dụ 2
5 3 3
1 9
2 3
2 6
3 1
3 5
1 10
2 7
2 5
1
Ví dụ 3
5 5 5
1 9
2 3
3 6
4 1
5 5
1 10
2 7
3 5
4 8
5 6
4
Ví dụ 4
3 3 2
1 5
1 5
1 1
1 2
1 2
2 2
1
JOIG 2025/2026 - Chung kết, Cuộc thi 3, bài Packing Snacks.
Tài liệu gốc của Japanese Committee for IOI được phát hành theo giấy phép CC BY-SA 4.0.
Bạn có biết công ty Just Odd Inventions không? Công ty này chỉ chuyên tạo ra những phát minh kỳ lạ; chúng ta gọi tắt là JOI.
Trong một phòng thí nghiệm của JOI có một mạch điện phức tạp gồm \(N\) nút và \(M\) điện trở mảnh. Các nút được đánh số từ \(0\) đến \(N-1\), các điện trở được đánh số từ \(0\) đến \(M-1\). Mỗi nút có thể được đặt ở một trong hai trạng thái: điện áp cao hoặc điện áp thấp. Điện trở \(i\) nối từ nút \(A_i\) đến một nút khác \(B_i\). Dòng điện chạy qua điện trở này khi và chỉ khi \(A_i\) ở điện áp cao và \(B_i\) ở điện áp thấp; dòng điện chỉ có thể chạy theo chiều đó. Giữa hai nút bất kỳ có nhiều nhất một điện trở, không phân biệt chiều nối.
Bạn là nhà nghiên cứu tại JOI và sẽ tiến hành thí nghiệm với mạch này. Các điện trở quá mảnh nên bạn không thể nhìn thấy chúng nối những cặp nút nào. Tuy nhiên, có một manh mối: khi đặt điện áp cho các nút, nhiệt độ của mạch tăng theo số điện trở có dòng điện chạy qua. Bạn quyết định chạm vào mạch để so sánh nhiệt độ. Bạn không thể đo nhiệt độ chính xác, nhưng có thể thử hai cách đặt điện áp và so sánh nhiệt độ của mạch giữa hai cách đó. Mỗi lần so sánh chỉ cho biết một trong ba kết quả:
Mục tiêu là dùng các phép so sánh này để xác định toàn bộ điện trở, tức là tất cả các cặp có thứ tự \((a,b)\) sao cho có điện trở từ nút \(a\) đến nút \(b\). Bạn được biết trước \(N\) và \(M\), cũng như các điều kiện mỗi điện trở nối hai nút khác nhau và giữa mỗi cặp nút có nhiều nhất một điện trở, không phân biệt chiều. Chỉ dựa vào những điều kiện đó và thông tin từ các phép so sánh nhiệt độ, hãy xác định toàn bộ các cặp \((a,b)\).
Tùy cấu trúc mạch, có thể không xác định duy nhất các điện trở dù thực hiện bao nhiêu phép so sánh đi nữa. Khi đó, bạn phải báo rằng không thể xác định duy nhất mạch. Đây là tính không thể xác định vốn có của mạch, không phải chỉ do hết lượt truy vấn.
Để tránh làm hỏng điện trở, bạn được so sánh nhiệt độ tối đa \(30000\) lần. Nhân tiện, phát minh mà JOI đang chế tạo bằng mạch điện này là bí mật ngay cả trong công ty; chỉ chủ tịch biết nó là gì.
Cho số nút và số điện trở, hãy viết chương trình xác định các điện trở hoặc báo rằng không thể xác định duy nhất, bằng không quá \(30000\) phép so sánh nhiệt độ.
Đây là bài tương tác qua hàm. Nộp mã C++ có #include "voltage.h" và cài đặt hàm sau, không viết main:
bool solve(int N, int M);
false nếu không thể xác định duy nhất các điện trở dù thực hiện bao nhiêu phép so sánh nhiệt độ đi nữa; ngược lại, trả về true.true khi không thể xác định duy nhất bị chấm Wrong Answer [1].false khi có thể xác định mạch từ các phép so sánh nhiệt độ bị chấm Wrong Answer [2].Chương trình được gọi hai hàm sau do hệ thống cung cấp:
int query(std::vector<int> x, std::vector<int> y);
void answer(int a, int b);
Hàm query thực hiện hai cách đặt điện áp và so sánh nhiệt độ:
x mô tả cách đặt thứ nhất, y mô tả cách đặt thứ hai. Mỗi mảng phải có độ dài \(N\) và chỉ gồm \(0\) hoặc \(1\).x[k] = 1 đặt nút \(k\) ở điện áp cao trong cách thứ nhất, còn x[k] = 0 đặt nút đó ở điện áp thấp. y[k] có ý nghĩa tương tự cho cách thứ hai.-1 nếu cách thứ nhất có nhiều điện trở dẫn điện hơn, 0 nếu bằng nhau, hoặc 1 nếu cách thứ hai có nhiều điện trở dẫn điện hơn.x khác \(N\): Wrong Answer [3].x chứa giá trị khác \(0,1\): Wrong Answer [4].y khác \(N\): Wrong Answer [5].y chứa giá trị khác \(0,1\): Wrong Answer [6].Hàm answer báo một điện trở đã xác định, có chiều từ nút \(a\) đến nút \(b\):
solve trả về true, phải đã gọi answer đúng \(M\) lần; nếu không, bị chấm Wrong Answer [11].solve trả về true, mỗi cặp \((a,b)\) đã báo phải thực sự tương ứng với một điện trở từ \(a\) đến \(b\); nếu không, bị chấm Wrong Answer [12].Bạn có thể cài đặt các hàm phụ hoặc khai báo biến toàn cục dùng nội bộ. Chương trình nộp không được dùng đầu vào/đầu ra chuẩn hay tương tác với tệp khác. Có thể dùng luồng lỗi chuẩn để gỡ lỗi.
Hệ thống chấm không thích nghi: đáp án được cố định từ trước khi bắt đầu tương tác.
Bộ tệp công khai gồm voltage.h, mã khung voltage.cpp, chương trình chấm mẫu grader.cpp và compile.sh. Chương trình chấm mẫu khác với hệ thống chấm chính thức. Để thử chương trình, đặt grader.cpp, voltage.cpp và voltage.h trong cùng thư mục rồi biên dịch bằng lệnh:
g++ -std=gnu++20 -O2 -o grader grader.cpp voltage.cpp
Hoặc chạy sh compile.sh. Tệp thực thi được tạo có tên grader.
Chương trình chấm mẫu chạy trong một tiến trình, đọc dữ liệu từ đầu vào chuẩn và ghi kết quả ra đầu ra chuẩn. Đầu vào có dạng:
N M
A_0 B_0
A_1 B_1
...
A_{M-1} B_{M-1}
Nếu phát hiện một lỗi từ Wrong Answer [3] đến Wrong Answer [12], chương trình chấm mẫu in loại lỗi, chẳng hạn Wrong Answer [5], và kết thúc ngay. Nếu đồng thời vi phạm nhiều điều kiện, chỉ một lỗi được hiển thị.
Nếu không phát hiện các lỗi đó, chương trình chấm mẫu in số lần gọi query và giá trị trả về của solve, chẳng hạn Accepted: 30 true.
Chương trình chấm mẫu không kiểm tra Wrong Answer [1] và Wrong Answer [2], tức là không kiểm tra giá trị true/false mà solve trả về có đúng với khả năng xác định duy nhất mạch hay không. Vì vậy, thông báo Accepted từ chương trình chấm mẫu không đảm bảo chương trình đúng.
Bài nộp nhận dữ liệu qua các đối số của những hàm được mô tả ở trên, không đọc đầu vào chuẩn.
Bài nộp không ghi đầu ra chuẩn. Kết quả được trả qua giá trị trả về của các hàm được mô tả ở trên.
Dưới đây là đầu vào cho chương trình chấm mẫu và một chuỗi lời gọi hàm tương ứng.
Ví dụ 1
Dữ liệu vào của trình chấm mẫu:
5 6
0 2
2 1
0 3
3 2
3 4
4 1
Tương tác
Lời gọi solve |
Giá trị trả về | Lời gọi từ chương trình | Giá trị trả về |
|---|---|---|---|
solve(5, 6) |
|||
query([0,0,1,1,1], [1,1,1,0,0]) |
-1 |
||
query([1,0,1,0,0], [0,1,0,1,0]) |
0 |
||
query([0,1,1,1,0], [1,1,0,1,1]) |
1 |
||
answer(0, 2) |
|||
answer(0, 3) |
|||
answer(2, 1) |
|||
answer(3, 4) |
|||
answer(3, 2) |
|||
answer(4, 1) |
|||
true |
Giải thích
Trong lần gọi query đầu tiên:
Số điện trở dẫn điện trong cách thứ nhất lớn hơn nên hàm trả về \(-1\).
Ví dụ này thỏa mãn các ràng buộc của nhóm \(5,6\).
Trong các tệp ví dụ được đề gốc nhắc đến, sample-01-in.txt tương ứng với ví dụ trên; sample-02-in.txt thỏa mãn ràng buộc của tất cả các nhóm và sample-03-in.txt thỏa mãn các ràng buộc của nhóm \(3,4,5,6\).
JOI 2025/2026 - Chung kết, Cuộc thi 4, bài Voltage 2. Tài liệu gốc của Japanese Committee for IOI được phát hành theo giấy phép CC BY-SA 4.0.