CF1617D1 Too Many Impostors (easy version)

题目描述

这是一个交互题。简单版和困难版的唯一区别在于提问次数的限制。 有 $n$ 个玩家,编号从 $1$ 到 $n$。保证 $n$ 是 $3$ 的倍数。 其中有 $k$ 个是“impostor”,其余 $n-k$ 个是“crewmate”。“impostor”的数量 $k$ 未知。保证 $\frac{n}{3} < k < \frac{2n}{3}$。 每次提问,你可以选择三个不同的整数 $a$、$b$、$c$($1 \le a, b, c \le n$),询问:“在编号为 $a$、$b$、$c$ 的玩家中,impostor 的数量是否多于 crewmate?”如果 impostor 多,则返回整数 $0$,否则返回 $1$。 在最多询问 $2n$ 次的前提下,找出 impostor 的数量 $k$ 以及所有 impostor 的编号。 评测器是自适应的,这意味着 impostor 的编号可能不是事先固定的,可以根据你的提问动态决定。保证在任何时刻,至少存在一组 impostor 满足所有约束以及你所有提问的答案。

输入格式

每个测试点包含多组测试数据。第一行是测试数据组数 $t$($1 \le t \le 100$)。接下来每组测试数据: 每组测试数据的第一行包含一个整数 $n$($6 \le n < 10^4$,$n$ 是 $3$ 的倍数),表示玩家数量。 保证所有测试数据中 $n$ 的总和不超过 $2 \cdot 10^4$。

输出格式

对于每组测试数据,交互从读取 $n$ 开始。 然后你最多可以进行 $2n$ 次提问,格式如下: "? a b c"($1 \le a, b, c \le n$,$a$、$b$、$c$ 互不相同)。 每次提问后,你需要读取一个整数 $r$,如果在 $a$、$b$、$c$ 这三名玩家中 impostor 多于 crewmate,则 $r=0$,否则 $r=1$。 如果你收到 $-1$,说明你的提问不合法或超出了提问次数限制。此时应立即退出,否则会收到 Wrong answer 判定。否则你的程序会继续读取已关闭的流,可能得到任意判定。 当你找出所有 impostor 的编号后,输出一行: "! "(不含引号),后接 impostor 的数量 $k$,再接 $k$ 个 impostor 的编号。请注意,所有信息必须在同一行输出。 输出后,程序应继续处理剩余测试数据,或在全部处理完毕后退出。 每次输出后请务必换行并刷新输出缓冲区,否则会收到 Idleness limit exceeded 判定。刷新方法如下: - C++:fflush(stdout) 或 cout.flush() - Java:System.out.flush() - Pascal:flush(output) - Python:stdout.flush() - 其它语言请查阅相关文档。

说明/提示

示例交互说明(仅用于演示交互流程,不提供解题思路): 对于第一组测试数据: 提问 "? 1 2 3" 返回 $0$,说明 $1$、$2$、$3$ 号玩家中 impostor 多于 crewmate。 提问 "? 3 4 5" 返回 $1$,说明 $3$、$4$、$5$ 号玩家中 crewmate 多于 impostor。 输出 "! 3 4 1 2" 表示找到了所有 impostor,数量为 $k=3$,编号为 $4$、$1$、$2$。 对于第二组测试数据: 提问 "? 7 1 9" 返回 $1$,说明 $7$、$1$、$9$ 号玩家中 crewmate 多于 impostor。 输出 "! 4 2 3 6 8" 表示找到了所有 impostor,数量为 $k=4$,编号为 $2$、$3$、$6$、$8$。 由 ChatGPT 4.1 翻译