QOJ.ac

QOJ

시간 제한: 3.0 s 메모리 제한: 512 MB 총점: 100 인터랙티브

#16265. 寻找假币

통계

这是一个交互式问题。

在你面前有一批共 $n$ 枚金币,其中有 $k$ 枚是假币。所有金币排成一排。第 $i$ 枚金币的标称重量为 $i$ 克。如果某枚金币是假币,它的实际重量为 $0$ 克。

禁止直接触摸金币,你唯一可以进行的操作是:选择某个 $1 \le p \le n$,并称量前 $p$ 枚金币。作为结果,你将被告知这些金币的实际总重量。

请使用尽可能少的操作,找出哪 $k$ 枚金币是假币。你的得分将取决于你的程序所做出的查询次数,详情请参阅“子任务”部分。

交互

每个测试点包含 $t$ 局游戏,在每局游戏中你都需要找出哪些金币是假币。第一行包含一个整数 $t$ ($1 \le t \le 50$) —— 游戏局数。每局游戏包含以下格式的交互。在所有游戏结束后,你的程序必须立即终止。

在每局游戏开始时,你会读入两个整数 $n$ 和 $k$ ($1 \le n \le 10^9$,$1 \le k \le \min(100, n)$)。之后,你可以进行若干次称量查询。

要进行称量查询,请输出 ? p。作为结果,你将读入一个整数 $a$。如果 $a = -1$,说明你的程序超过了单局游戏允许的最大查询次数限制,必须立即终止。每局游戏最多允许进行 $3500$ 次称量查询。否则,$a \ge 0$ 表示金币 $1, 2, \dots, p$ 的实际总重量。

要给出你猜出的假币集合,请输出 ! i1 i2 ... ik,其中 $1 \le i_1, i_2, \dots, i_k \le n$ 是假币的互不相同的下标,顺序任意。作为结果,你将读入一个整数 $a$。如果 $a = -1$,说明你的答案错误,程序必须立即终止。否则 $a = 1$,你的程序应当继续进行下一局游戏,或者在这是最后一局游戏时终止。

请注意,交互器是自适应(adaptive)的。不保证假币集合在游戏开始前就已经固定。唯一保证的是,在任何时刻,游戏中已给出的所有回答都至少对应一个合法的假币集合。如果你的回答与游戏中所有查询的回答相符,且不存在任何其他也符合所有回答的假币集合,则你的回答被认为是正确的。

在你的程序输出每次操作后,请输出换行符。在输出每次操作后,请务必清空输出缓冲区(flush)。

如果你使用 Pascal 中的 writeln、C++ 中的 cout << ... << endl、Java 中的 System.out.println、Python 中的 print 或 C# 中的 Console.WriteLine,缓冲区刷新将自动进行,无需额外操作。如果你使用其他输出方式,建议手动刷新输出缓冲区。请注意,在任何情况下都必须输出换行符。

样例

输入样例 1

2
3 2
2
1
10 4
13
13
20
29
1

输出样例 1

? 3
! 1 3
? 5
? 6
? 8
? 10
! 10 8 6 2

说明

在第一局游戏中,第 $1, 3$ 枚金币是假币。因此,金币的实际重量为 $[0, 2, 0]$。通过一次查询,我们得知它们的总重量为 $2$,之后可以唯一确定假币的集合。

在第二局游戏中,第 $2, 6, 8, 10$ 枚金币是假币。因此,金币的实际重量为 $[1, 0, 3, 4, 5, 0, 7, 0, 9, 0]$。根据称量查询的回答,可以唯一确定假币的集合。

子任务

本题的测试点共分为 6 个子任务。设 $q$ 为你的程序在单局游戏中进行的称量查询次数。

前 5 个子任务只有在通过该子任务的所有测试点以及所有必要子任务的测试点时才能得分。对于前 5 个子任务中的每一个,都固定了一个常数 $maxQ$。如果在某个测试点中,对于所有游戏均满足 $q \le maxQ$,则该测试点被视为通过。

在最后一个子任务(子任务 6)中,每局游戏的得分计算公式为 $\min\left(50, \left\lfloor 50 \sqrt{\frac{k+30}{q}} \right\rfloor\right)$。一个测试点的总得分等于该测试点中所有游戏得分的最小值。最后一个子任务的总得分等于该子任务中所有测试点得分的最小值。

请注意,如果你的程序在所有测试点的所有游戏中均满足 $q \le k + 30$,则可以获得满分 100 分。

子任务 分值 $n$ $k$ $maxQ$ 必要子任务 备注
0 0 $maxQ = 3500$ 样例
1 5 $n \le 1000$ $maxQ = 1000$ 0
2 9 $n \le 1000$ $maxQ = 600$ 0, 1
3 10 $k \le 30$ $maxQ = 1000$ 0
4 13 $k = 3$ $maxQ = 33$
5 13 $k = 4$ $maxQ = 34$
6 $\le 50$ $maxQ = 3500$ 部分分

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.