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