P13068 [GCJ 2020 #3] Pen Testing

题目描述

你有 $N$ 支圆珠笔。已知每支笔的墨水单位数都是 $0$ 到 $N-1$ 之间互不相同的整数,但这些笔是随机顺序给你的,因此你不知道哪支笔对应多少墨水。 你即将前往南极(那里没有笔),而你的行李只能装两支笔。你知道需要写很多重要的明信片,因此选择的两支笔的墨水总量必须至少为 $N$ 单位。 获取笔信息的唯一方法是选择一支笔尝试写字。尝试结果有两种:成功(该笔墨水减少 1 单位,可能用完)或失败(该笔已无墨水)。你可以重复测试同一支笔或不同笔。 最终,你必须选择两支笔带去南极。若这两支笔剩余墨水的总量不少于 $N$ 单位,则视为成功。 本题包含 $T$ 个测试用例,你需要在至少 $C$ 个用例中成功。注意本题所有测试集都是可见的。 ### 交互协议 这是一个交互题。 初始时,你的程序应读取一行包含三个整数 $\mathbf{T}$、$\mathbf{N}$ 和 $\mathbf{C}$:测试用例数量、笔的数量和需要成功的最少用例数。(注意 $\mathbf{N}$ 在所有测试集中相同,详见数据范围部分。) 然后,你的程序需要同时处理所有 $\mathbf{T}$ 个测试用例(这是为了减少交互次数)。交互以轮次进行。 每轮开始时,你的程序需输出一行 $\mathbf{T}$ 个整数:第 $i$ 个整数表示在第 $i$ 个测试用例中要测试的笔编号(1 到 $\mathbf{N}$),若该轮不测试则输出 0。 注意:如果在每个整数后立即刷新输出缓冲区(而非整行输出后刷新),可能导致超时错误。 评测机将返回一行 $\mathbf{T}$ 个整数:第 $i$ 个整数表示该轮第 $i$ 个测试用例的耗墨量。1 表示测试成功(耗墨 1 单位),0 表示测试失败(笔已无墨)或未测试。 最多可进行 $\mathbf{N} \times (\mathbf{N}+1)/2$ 轮交互(足以耗尽所有墨水)。 当准备提交答案时,输出一行包含 $\mathbf{T}$ 个 0。此行不计入交互轮次限制,评测机不会回复。 接着输出一行 $2 \times \mathbf{T}$ 个整数:第 $(2i-1)$ 和第 $2i$ 个整数表示第 $i$ 个测试用例选择的两支笔编号。输出后程序应立即终止。 若评测机收到意外输出,将返回 -1 并终止交互。程序需及时退出以避免超时错误。 注意:每次提交时,笔的初始顺序都是独立随机生成的。

输入格式

参见交互协议。

输出格式

参见交互协议。

说明/提示

**样例解释** 交互过程解析: ``` // 读取 T=2, N=5, C=1 t, n, c = readline_int_list() // 评测机秘密生成墨水分布: // 测试用例1: [2,0,4,1,3] // 测试用例2: [1,3,2,4,0] // 第一轮:测试用例1用笔4,测试用例2用笔5 printline 4 5 // 返回1 0(笔4有墨,笔5无墨) a1, a2 = readline_int_list() // 第二轮:测试用例1用笔4,测试用例2用笔3 printline 4 3 // 返回0 1(笔4已无墨,笔3有墨) a1, a2 = readline_int_list() // 第三轮:仅测试用例2用笔2 printline 0 2 // 返回0 1 a1, a2 = readline_int_list() // 准备提交答案 printline 0 0 // 选择笔3和笔4 printline 3 4 3 4 // 测试用例1:4+0