Số lớn nhì (OLP MT&TN lần 7)
Xem PDF
Điểm:
2100
Thời gian:
3.0s
Bộ nhớ:
256M
Input:
bàn phím
Output:
màn hình
Việt và Hàn cùng nhau chơi một trò chơi về toán học và thuật toán. Đầu tiên, hai bạn thống nhất với nhau ba số nguyên \(P, V\) và \(H\). Tiếp theo, có \(P\) ván chơi, mỗi ván chơi diễn ra theo quy tắc như sau:
- Việt nghĩ ra một hoán vị \(a_1, a_2, \dots, a_V\) của các số \((1, 2, \dots, V)\) và đố Hàn biết số \(1\) nằm ở vị trí nào trong hoán vị này. Nói cách khác, Hàn cần tìm chỉ số \(i\) sao cho \(a_i = 1\).
- Việt cho Hàn hỏi một số câu hỏi thuộc dạng sau: Hàn đưa ra một dãy số nguyên \(x_1, x_2, \dots, x_k\) thoả mãn \(0 < x_1 < x_2 < \dots < x_k < V + 1\). Khi đó, Việt sẽ nói cho Hàn chỉ số \(j\) sao cho \(a_{x_j}\) là số nhỏ thứ nhì trong các số \(\{a_{x_1}, a_{x_2}, \dots, a_{x_k}\}\).
- Hàn sẽ chiến thắng nếu tìm ra vị trí của số \(1\) trong hoán vị của Việt sau khi hỏi không quá \(H\) câu.
Yêu cầu: Hãy giúp Hàn chiến thắng Việt trong mọi ván chơi.
Tương tác
Đây là bài toán tương tác không thích ứng, nghĩa là hoán vị của Việt đã được cố định trước khi các ván chơi bắt đầu. Chương trình của bạn đóng vai Hàn, và máy chấm đóng vai Việt.
- Đầu tiên, chương trình của bạn cần đọc vào ba số nguyên \(P, V, H\).
- Tiếp theo, trò chơi diễn ra với \(P\) ván chơi. Mỗi ván chơi diễn ra như sau:
- Khi Hàn đặt một câu hỏi:
- Chương trình in ra hai dòng: dòng đầu gồm ký tự
?và số nguyên \(k \ge 2\); dòng thứ hai gồm \(k\) số nguyên \(x_1, x_2, \dots, x_k\). - Chương trình đọc vào một số nguyên thể hiện một trong các phản hồi sau:
-1nếu các tham số vừa in ra không hợp lệ hoặc Hàn đã đặt số câu hỏi nhiều hơn giới hạn. Khi đó, chương trình của bạn cần kết thúc ngay.- Vị trí \(i\) là câu trả lời của Việt.
- Chương trình in ra hai dòng: dòng đầu gồm ký tự
- Khi Hàn kết luận vị trí của số \(1\):
- Chương trình in ra một dòng duy nhất gồm ký tự
!và một số nguyên \(m\) thể hiện câu trả lời của Hàn. - Chương trình đọc vào một số nguyên thể hiện một trong các phản hồi sau:
-1: câu trả lời của Hàn không chính xác. Khi đó, chương trình của bạn cần kết thúc ngay.1: câu trả lời của Hàn chính xác. Khi đó, chương trình của bạn cần chuyển sang ván chơi tiếp theo, hoặc kết thúc ngay nếu đây là ván chơi cuối cùng.
- Chương trình in ra một dòng duy nhất gồm ký tự
- Khi Hàn đặt một câu hỏi:
Lưu ý: Sau khi bạn in ra một dòng, bạn cần in ra ký tự xuống dòng và thực hiện thao tác flush luồng ra chuẩn bằng cách gọi các lệnh sau:
fflush(stdout)hoặccout.flush()trong C++;System.out.flush()trong Java;stdout.flush()trong Python;
Example
Subtask
- Subtask 1 (60 điểm): \(P = 809, V = 13, H = 12\).
- Subtask 2 (40 điểm): \(P = 1301, V = 25, H = 8\).

Bình luận (1)