luogu#P7109. 滴水不漏
滴水不漏
题目背景
这是一道 IO 交互题。
题目描述
Gnar 购买了 个水缸,其中第 个水缸的容积为 且因不明原因初始装有 ()单位的水。
好奇的 Gnar 想知道每个水缸装有的水量,但肉眼观察显然不可行,他希望你能帮他计算解决这个难题。
Gnar 唯一能替你执行的操作是,由你先指定 (),然后:
- 若 ,滴水不漏地将第 个水缸的水往第 个水缸倒,直到第 个水缸的水被倒完或第 个水缸已满。Gnar 会告诉你操作后第 个水缸是否是满的。注意倒水的影响会保留而不是恢复到操作前。
- 若 ,Gnar 做不到让一个水缸的水往自己倒,他会直接告诉你当前第 个水缸是否是满的。
Gnar 只肯接受最多 次操作,否则他会认为你在调戏他!
你的任务是利用不超过 次操作 Gnar 告诉的结果,完整求出最初的 。
当然 Gnar 不会动手脚,你所求的 在操作前已经存在,不随操作动态生成。
输入格式
输入单个正整数水缸个数 以开始交互。
输出格式
在你确定答案后,用 ! a1 a2 ... an
的形式输出一行以结束交互。
交互格式
交互过程中,用 ? i j
的形式输出一行以执行一次操作。然后你应输入一个布尔值,即操作的返回值 。若 ,表示第 个水缸未满;若 ,表示第 个水缸已满。
上述的所有输入都应从标准输入中读入,所有输出都应向标准输出中输出。输出一行后必须清空缓冲区,否则你的评测将被判为 Time Limit Exceeded。清空缓冲区方式如下:
- 在 C++ 中,使用
fflush(stdout)
或cout.flush()
。 - 在 Pascal 中,使用
flush(output)
。 - 在 Python 中,使用
stdout.flush()
。 - 其他语言请自行查阅文档。
如果你的输出格式错误,或执行超过 次操作,你的评测将被判为 Wrong Answer。
2
0
1
0
? 1 1
? 2 1
? 1 2
! 0 1
提示
【样例解释 #1】
样例示意了一种可能的交互过程。
初始两个水缸中分别装有 单位的水。
第一次操作,由于 ,你直接得知 即第一个水缸未满。
第二次操作后两个水缸装有水量分别为 ,而你得知 即第一个水缸当前已满。
第三次操作后两个水缸装有水量分别为 ,而你得知 即第二个水缸当前未满。
注意过程中确切水量并不传达给你,但是通过返回值 你足够唯一确定 ,。
【数据规模与约定】
本题采用捆绑测试。你必须通过 Subtask 中所有的测试点才能获得该 Subtask 的分数。
- Subtask #1 (8 points):。
- Subtask #2 (17 points):。
- Subtask #3 (15 points):。
- Subtask #4 (15 points):。
- Subtask #5 (25 points):。
- Subtask #6 (20 points):无特殊限制。
对于所有的数据,保证 ,。