CF2022D1.Asesino (Easy Version)
普及+/提高
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
这是该问题的简单版本。在本版本中,你最多可以询问 n+69 个问题。只有在你同时解决了两个版本的问题后,才能进行 Hack。
这是一个交互题。
在墨西哥国家 IOI 集训中,有一个传统游戏叫做“Asesino”,它类似于“Among Us”或“Mafia”。
今天,有 n 名玩家(编号从 1 到 n)将参与“Asesino”游戏,游戏中有以下三种角色:
- 骑士(Knight):骑士总是说真话。
- 恶棍(Knave):恶棍总是说谎话。
- 冒名顶替者(Impostor):冒名顶替者被所有人认为是骑士,但实际上是恶棍。
每个玩家都会被分配一个角色。游戏中恰好有一名冒名顶替者,但骑士和恶棍的人数可以为任意(可能为零)。
作为游戏主持人,你不小心忘记了所有人的角色,但你需要找出谁是冒名顶替者。
为了确定冒名顶替者,你可以提出一些问题。每次提问,你可以选择两名玩家 i 和 j(1≤i,j≤n,i=j),询问玩家 i 是否认为玩家 j 是骑士。问题的结果如下表所示:
| 骑士 | 恶棍 | 冒名顶替者 | |
|---|---|---|---|
| 骑士 | 是 | 否 | 是 |
| 恶棍 | 否 | 是 | 否 |
| 冒名顶替者 | 否 | 是 | — |
表中第 a 行第 b 列的单元格表示当 i 的角色为 a,j 的角色为 b 时的回答。例如,第一行第三列的“是”表示当 i 是骑士,j 是冒名顶替者时的回答。
你需要在最多 n+69 次提问内找出冒名顶替者。
注意:评测器是自适应的:玩家的角色在一开始并未固定,可能会根据你的提问动态变化。但保证始终存在一种角色分配方案,使得所有已提问题的答案都满足本题的约束条件。
输入格式
输入的第一行包含一个整数 t(1≤t≤103),表示测试用例的数量。接下来是每个测试用例的描述。
每个测试用例的第一行包含一个整数 n(3≤n≤105),表示参与游戏的人数。
保证所有测试用例中 n 的总和不超过 105。
输出格式
每次提问时,输出一行,格式如下:
- "? i j"(1≤i,j≤n,i=j)——询问玩家 i 是否认为玩家 j 是骑士。
评测器会输出 "1" 表示玩家 i 认为玩家 j 是骑士,输出 "0" 表示不是。
当你确定了冒名顶替者是谁后,输出一行,格式如下:
- "! i"(1≤i≤n)——表示第 i 位玩家是冒名顶替者。
注意,输出答案不计入 n+69 次提问的限制。
如果你的输出无效、提问次数超过 n+69 或错误地确定了冒名顶替者,评测器会返回 "-1",你的程序必须立即终止。否则,你的解答可能会因为读取已关闭的流而得到任意判定。
每次输出后请不要忘记换行并刷新输出缓冲区,否则会因“Idleness limit exceeded”而判错。具体做法如下:
- C++:fflush(stdout) 或 cout.flush()
- Java:System.out.flush()
- Python:sys.stdout.flush()
- Rust:stdiostdout().flush()
- 其它语言请查阅相关文档。
Hack 格式
对于 Hack,请使用如下格式。
第一行包含一个整数 t,表示测试用例数量。
每个测试用例的第一行包含整数 n,后跟字符串 "manual"。
第二行包含 n 个整数 a1,a2,…,an(−1≤ai≤1),表示每个玩家的角色。1 表示骑士,0 表示恶棍,−1 表示冒名顶替者。必须恰好有一个 ai=−1。
例如,Hack 格式的输入如下:
2
7 manual
0 1 0 -1 0 1 0
4 manual
0 1 -1 0
输入输出样例
输入#1
2 7 1 0 0 1 1 0 0 1 4 0 1 1 1
输出#1
? 1 3 ? 7 6 ? 2 5 ? 6 2 ? 4 5 ? 4 6 ? 1 4 ? 2 4 ! 4 ? 1 2 ? 2 3 ? 3 4 ? 4 1 ! 3
说明/提示
注意,示例测试用例并不代表最优的提问策略,仅用于演示交互格式。具体来说,我们无法通过示例中的提问确定冒名顶替者。
在第一个测试用例中,第 2 和 6 号玩家是骑士,第 1、3、5、7 号玩家是恶棍,第 4 号玩家是冒名顶替者。以下是每次提问的解释:
- 第一次提问,i 是恶棍,j 是恶棍。答案为“是”,因为恶棍总是说谎。
- 第二次提问,i 是恶棍,j 是骑士。答案为“否”,因为恶棍总是说谎。
- 第三次提问,i 是骑士,j 是恶棍。答案为“否”,因为骑士总是说真话。
- 第四次提问,i 是骑士,j 是骑士。答案为“是”,因为骑士总是说真话。
- 第五次提问,i 是冒名顶替者,j 是恶棍。答案为“是”,因为冒名顶替者总是说谎。
- 第六次提问,i 是冒名顶替者,j 是骑士。答案为“否”,因为冒名顶替者总是说谎。
- 第七次提问,i 是恶棍,j 是冒名顶替者。答案为“否”,因为恶棍总是说谎,并且恶棍认为冒名顶替者是骑士。
- 第八次提问,i 是骑士,j 是冒名顶替者。答案为“是”,因为骑士总是说真话,并且骑士认为冒名顶替者是骑士。
由 ChatGPT 4.1 翻译
输入解题思路,AI测评打分。不知道怎么写?