CF2022D1.Asesino (Easy Version)

普及+/提高

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

这是该问题的简单版本。在本版本中,你最多可以询问 n+69n+69 个问题。只有在你同时解决了两个版本的问题后,才能进行 Hack。

这是一个交互题。

在墨西哥国家 IOI 集训中,有一个传统游戏叫做“Asesino”,它类似于“Among Us”或“Mafia”。

今天,有 nn 名玩家(编号从 11 到 nn)将参与“Asesino”游戏,游戏中有以下三种角色:

  • 骑士(Knight):骑士总是说真话。
  • 恶棍(Knave):恶棍总是说谎话。
  • 冒名顶替者(Impostor):冒名顶替者被所有人认为是骑士,但实际上是恶棍。

每个玩家都会被分配一个角色。游戏中恰好有一名冒名顶替者,但骑士和恶棍的人数可以为任意(可能为零)。

作为游戏主持人,你不小心忘记了所有人的角色,但你需要找出谁是冒名顶替者。

为了确定冒名顶替者,你可以提出一些问题。每次提问,你可以选择两名玩家 ii 和 jj(1≤i,j≤n1 \leq i, j \leq n,i≠ji \neq j),询问玩家 ii 是否认为玩家 jj 是骑士。问题的结果如下表所示:

骑士 恶棍 冒名顶替者
骑士 是 否 是
恶棍 否 是 否
冒名顶替者 否 是 —

表中第 aa 行第 bb 列的单元格表示当 ii 的角色为 aa,jj 的角色为 bb 时的回答。例如,第一行第三列的“是”表示当 ii 是骑士,jj 是冒名顶替者时的回答。

你需要在最多 n+69n+69 次提问内找出冒名顶替者。

注意:评测器是自适应的:玩家的角色在一开始并未固定,可能会根据你的提问动态变化。但保证始终存在一种角色分配方案,使得所有已提问题的答案都满足本题的约束条件。

输入格式

输入的第一行包含一个整数 tt(1≤t≤1031 \leq t \leq 10^3),表示测试用例的数量。接下来是每个测试用例的描述。

每个测试用例的第一行包含一个整数 nn(3≤n≤1053 \le n \le 10^5),表示参与游戏的人数。

保证所有测试用例中 nn 的总和不超过 10510^5。

输出格式

每次提问时,输出一行,格式如下:

  • "? i j"(1≤i,j≤n1 \leq i, j \leq n,i≠ji \neq j)——询问玩家 ii 是否认为玩家 jj 是骑士。

评测器会输出 "1" 表示玩家 ii 认为玩家 jj 是骑士,输出 "0" 表示不是。

当你确定了冒名顶替者是谁后,输出一行,格式如下:

  • "! i"(1≤i≤n1 \leq i \leq n)——表示第 ii 位玩家是冒名顶替者。

注意,输出答案不计入 n+69n+69 次提问的限制。

如果你的输出无效、提问次数超过 n+69n+69 或错误地确定了冒名顶替者,评测器会返回 "-1",你的程序必须立即终止。否则,你的解答可能会因为读取已关闭的流而得到任意判定。

每次输出后请不要忘记换行并刷新输出缓冲区,否则会因“Idleness limit exceeded”而判错。具体做法如下:

  • C++:fflush(stdout) 或 cout.flush()
  • Java:System.out.flush()
  • Python:sys.stdout.flush()
  • Rust:stdiostdout().flush()
  • 其它语言请查阅相关文档。

Hack 格式

对于 Hack,请使用如下格式。

第一行包含一个整数 tt,表示测试用例数量。

每个测试用例的第一行包含整数 nn,后跟字符串 "manual"。

第二行包含 nn 个整数 a1,a2,…,ana_1, a_2, \ldots, a_n(−1≤ai≤1-1 \le a_i \le 1),表示每个玩家的角色。11 表示骑士,00 表示恶棍,−1-1 表示冒名顶替者。必须恰好有一个 ai=−1a_i=-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

说明/提示

注意,示例测试用例并不代表最优的提问策略,仅用于演示交互格式。具体来说,我们无法通过示例中的提问确定冒名顶替者。

在第一个测试用例中,第 22 和 66 号玩家是骑士,第 11、33、55、77 号玩家是恶棍,第 44 号玩家是冒名顶替者。以下是每次提问的解释:

  • 第一次提问,ii 是恶棍,jj 是恶棍。答案为“是”,因为恶棍总是说谎。
  • 第二次提问,ii 是恶棍,jj 是骑士。答案为“否”,因为恶棍总是说谎。
  • 第三次提问,ii 是骑士,jj 是恶棍。答案为“否”,因为骑士总是说真话。
  • 第四次提问,ii 是骑士,jj 是骑士。答案为“是”,因为骑士总是说真话。
  • 第五次提问,ii 是冒名顶替者,jj 是恶棍。答案为“是”,因为冒名顶替者总是说谎。
  • 第六次提问,ii 是冒名顶替者,jj 是骑士。答案为“否”,因为冒名顶替者总是说谎。
  • 第七次提问,ii 是恶棍,jj 是冒名顶替者。答案为“否”,因为恶棍总是说谎,并且恶棍认为冒名顶替者是骑士。
  • 第八次提问,ii 是骑士,jj 是冒名顶替者。答案为“是”,因为骑士总是说真话,并且骑士认为冒名顶替者是骑士。

由 ChatGPT 4.1 翻译

输入解题思路,AI测评打分。不知道怎么写?

首页