#CCAC000114. 蒂娜的谜箱
蒂娜的谜箱
题目描述
这是一道交互题。
蒂娜准备了 个方块,分别标有整数 ,以及从左到右编号为 的 个格子。她已经为这些方块确定了一种正确的摆放顺序,并将它藏在了谜箱中。
正确顺序可以表示为一个排列 ,其中 表示第 个格子中应当放置的方块编号。这个排列在交互开始前已经确定,在整个交互过程中不会改变。
你可以反复尝试摆放方块。每次尝试时,每个格子至多放置一个方块,同一个方块至多使用一次,也可以留下一些空格子。蒂娜只会告诉你:有多少个格子中放置了正确的方块。
你需要在不超过 次尝试后,确定并提交完整的正确顺序。最终提交不计入尝试次数。
输入格式
交互开始时,你的程序需要从标准输入读取一个整数 (),表示方块和格子的数量。
单次程序运行只包含一局游戏,没有测试组数 。隐藏排列 不会作为输入提供给选手程序。
此后,输入内容为交互器对询问命令的回复,具体格式见交互格式。最终提交后没有回复。
输出格式
你的程序需要按照交互格式向标准输出发送询问,并最终提交排列 。
每条命令必须单独占一行,包含一个命令符和恰好 个整数。每次输出命令后,都必须换行并刷新输出缓冲区。
发送询问命令后,应读取交互器的回复;发送最终提交命令后,应立即结束程序,不再读取任何内容。
交互格式
你的程序可以发送以下两种命令。
1. 询问一次摆放方案
输出一行:
对于所有 ,必须满足 。其中, 表示第 个格子留空; 表示在第 个格子中放置编号为 的方块。所有非零的 必须互不相同, 可以重复出现。
交互器回复一个整数
$$r=\left|\left\{i\mid 1\le i\le n,\ a_i=p_i\right\}\right|,$$表示正确放置的方块数量。空格子不计入正确数量。将所有格子留空也是一次合法询问,并计入询问次数。
你最多可以发送 次询问。即使某次询问的回复为 ,你仍然需要通过最终提交命令提交答案。
2. 提交最终答案
输出一行:
其中 必须是 的一个排列。
如果对于所有 都有 ,则答案正确;否则,答案错误。
交互器不会对最终提交作出任何回复。输出最终答案、换行并刷新输出缓冲区后,你的程序必须立即结束,不应再尝试读取任何内容。
最终答案只能提交一次,且不计入 次询问的限制。
3. 交互注意事项
在询问阶段,如果你的程序发出了非法命令或询问次数超过限制,交互器将回复 并结束交互。如果读取到 或读取失败,你的程序必须立即结束,不能继续输出。
对于最终提交,交互器将直接判定答案并结束交互,无论答案正确与否,都不会发送回复。
命令符与整数、相邻整数之间应使用空格或制表符分隔。行首、行末的空格或制表符不影响判定。不得输出空行、额外字段,或将一条命令拆成多行。
每次输出命令后必须刷新输出缓冲区。例如,使用 C++ 时可以调用 cout.flush(),或使用会同时换行并刷新的 endl。
4
0
2
4
? 1 2 3 4
? 0 1 0 2
? 3 1 4 2
! 3 1 4 2
样例解释
在样例中,,隐藏排列为 。隐藏排列仅在这里用于解释样例,不会由交互器发送给选手程序。
样例输入依次列出了交互器发送的内容,样例输出依次列出了选手程序发送的内容。它们是双方交互记录的两个方向,不是普通的离线输入输出。实际交互必须按以下顺序进行:
| 顺序 | 发送方 | 发送内容 |
|---|---|---|
| 1 | 交互器 | 4 |
| 2 | 选手程序 | ? 1 2 3 4 |
| 3 | 交互器 | 0 |
| 4 | 选手程序 | ? 0 1 0 2 |
| 5 | 交互器 | 2 |
| 6 | 选手程序 | ? 3 1 4 2 |
| 7 | 交互器 | 4 |
| 8 | 选手程序 | ! 3 1 4 2 |
第一次询问没有任何方块放在正确的位置,因此回复为 。
第二次询问只在第 个格子和第 个格子中放置了方块,它们都正确,因此回复为 。
第三次询问的四个位置都正确,因此回复为 。选手程序随后发送最终提交命令,换行并刷新输出缓冲区后立即结束。交互器判定答案正确,不再发送回复。
样例只展示一种合法的交互过程,不表示能够用相同次数的询问解决所有隐藏排列。
相关
在下列比赛中: