QOJ.ac

QOJ

時間限制: 4 s 記憶體限制: 1024 MB 總分: 100 通信

#7161. 猜数字游戏

统计

在隆德(Lund)古镇,有一条街上有 $N$ 栋排成一行的房子,编号为 $0$ 到 $N-1$。Emma 住在其中一栋房子里,她的朋友 Anna 和 Bertil 想找出她住在哪里。Emma 决定和他们玩一个游戏,而不是直接告诉朋友她住在哪里。在游戏开始前,Anna 和 Bertil 只知道街上的房子总数。此时,Anna 和 Bertil 可以选择一个正整数 $K$ 并商定一个策略。此后禁止任何交流。

游戏分为两个阶段。在第一阶段,Emma 选择一个访问房子的顺序,使得她自己的房子是最后一个被访问的。然后,她按此顺序带领 Anna 一一参观这些房子,且不提前告知 Anna 访问顺序。对于每一栋不是 Emma 住处的房子,Anna 可以用粉笔在门上写下一个 $1$ 到 $K$ 之间的整数。对于最后一栋访问的房子(即 Emma 的住处),由 Emma 自己在门上写下一个 $1$ 到 $K$ 之间的整数。

在游戏的第二阶段,Bertil 沿着街道从 $0$ 号房子走到 $N-1$ 号房子,并读取 Anna 和 Emma 写在门上的所有数字。他现在想要猜出 Emma 住在哪里。他有两次猜测机会,如果他猜对了,他和 Anna 就赢得了游戏。否则,Emma 获胜。

你能设计一个策略,保证 Anna 和 Bertil 赢得游戏吗?你的策略将根据 $K$ 的值进行评分($K$ 越小越好)。

实现细节

这是一个多轮运行问题,意味着你的程序将被多次执行。第一次运行时,它将执行 Anna 的策略。之后,它将执行 Bertil 的策略。

输入的第一行包含两个整数 $P$ 和 $N$,其中 $P$ 为 $1$ 或 $2$(分别代表第一阶段或第二阶段),$N$ 是房子的数量。除了样例输入(不用于评分)外,$N$ 始终等于 $100\,000$。

后续输入取决于阶段:

第一阶段

你的程序应首先输出一个整数 $K$($1 \le K \le 1\,000\,000$)。 然后,程序需要读取 $N-1$ 次包含索引 $i$($0 \le i < N$)的行,并输出一行包含一个整数 $A_i$($1 \le A_i \le K$),表示 Anna 在 $i$ 号房子的门上写的数字。除了 Emma 住处的索引外,每个索引 $i$ 都会恰好出现一次,顺序由评测机决定。

第二阶段

你的程序应读取一行包含 $N$ 个整数 $A_0, A_1, \dots, A_{N-1}$ 的数据,其中 $A_i$ 是写在 $i$ 号房子门上的数字。 然后,它应打印一行包含两个整数 $s_1$ 和 $s_2$($0 \le s_i < N$),即猜测的索引。$s_1$ 和 $s_2$ 可以相等。

实现细节

注意,当程序在第二阶段运行时,程序会重新启动。这意味着你无法在两次运行之间保存变量信息。

在你打印每一行后,请确保刷新标准输出,否则你的程序可能会被判为“超出时间限制”(Time Limit Exceeded)。在 Python 中,print() 会自动刷新。在 C++ 中,cout << endl; 除了打印换行符外还会刷新缓冲区;如果使用 printf,请使用 fflush(stdout)

本题的评测机可能是自适应的,这意味着它可能会根据你程序的输出改变其行为,以防止启发式解法通过。它可能会先试运行第一阶段,观察你的输出,然后利用从前一次运行中提取的信息进行正式的第一阶段运行。

你的程序必须是确定性的,即在相同输入下运行两次时表现一致。如果你想在程序中使用随机性,请确保使用固定的随机种子。这可以通过向 srand(C++)或 random.seed(Python)传递硬编码的常量来实现,或者如果使用 C++11 的随机数生成器,则在构造生成器时指定种子。特别地,你不能在 C++ 中使用 srand(time(NULL))。如果评测机检测到你的程序不是确定性的,它将给出“答案错误”(Wrong Answer)的判决。

如果你的程序(最多 3 次)单独运行的总时间超过了时间限制,你的提交将被判为“超出时间限制”。

子任务

你的解法将在多个测试用例上进行测试。如果你的解法在任何测试用例上失败(例如给出错误答案、崩溃、超出时间限制等),你将获得 0 分。

如果你的程序在所有测试用例中都成功找到了 Emma 的住处,你将获得“通过”(Accepted)的判决,并根据所有测试用例中使用的 $K$ 的最大值 $K_{max}$ 计算得分。得分规则如下:

$K_{max}$ 的范围 得分
$K_{max} > 99\,998$ $10$ 分
$10\,000 < K_{max} \le 99\,998$ $10 + \lfloor 40(1 - K_{max}/10^5) \rfloor$ 分
$30 < K_{max} \le 10\,000$ $46 + \lfloor 31(4 - \log_{10}(K_{max}))/(4 - \log_{10}(30)) \rfloor$ 分
$7 < K_{max} \le 30$ $107 - K_{max}$ 分
$K_{max} \le 7$ $100$ 分

评分函数如下图所示:

样例测试用例不计入评分,你的解法不需要通过样例。

样例

样例输入 1

1 4
2
0
3
1

样例输出 1

3
3
1
2

样例输入 2

2 4
1 2 3 2

样例输出 2

1 3

说明

样例交互过程: 假设 $N=4$,Emma 住在 1 号房子。令 $A$ 为写在房子上的数字列表。初始时 $A = [0, 0, 0, 0]$,其中 $0$ 表示对应房子上没有写数字。

在代码的第一次运行中: 给定 $N=4$。你的程序响应 $K=3$。 询问 $A_2$。你的程序响应 $3$。此时 $A = [0, 0, 3, 0]$。 询问 $A_0$。你的程序响应 $1$。此时 $A = [1, 0, 3, 0]$。 询问 $A_3$。你的程序响应 $2$。此时 $A = [1, 0, 3, 2]$。 最后,评测机设置 $A_1 = 2$,最终 $A = [1, 2, 3, 2]$。这标志着第一阶段结束。

在代码的第二阶段,你的程序接收到列表 1 2 3 2。 它响应 1 3。 由于其中一个猜测是正确的房子索引(1),Anna 和 Bertil 赢得了游戏。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download

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.