QOJ.ac

QOJ

実行時間制限: 3 s メモリ制限: 1024 MB 満点: 12 インタラクティブ

#11467. Zillionim

統計

Zillionim 是一个双人回合制游戏。初始时,有 $10^{12}$ 枚硬币首尾相连排成一行,从左到右编号为 $1$ 到 $10^{12}$。在每一回合中,玩家必须选择 $10^{10}$ 枚连续的硬币并将它们移除。原本不相邻的两枚硬币,即使它们中间的所有硬币都被移除了,也不会变得相邻。

在自己的回合,玩家若能进行有效操作则必须进行,随后轮到对手。如果玩家在自己的回合无法进行任何有效操作,则该玩家输掉游戏(对手获胜)。

由于我们的工程师仍在努力训练机器学习模型来玩 Zillionim,我们创建了一个简单的 AI,通过随机移动来玩 Zillionim。AI 总是先手。在 AI 的每一回合,它会确定所有可能的有效操作,并从中等概率随机选择一个。

你能击败这个 AI 吗……至少在大多数时候?

输入格式

这是一个交互式问题。请确保你已阅读 FAQ 中关于“交互式问题”的部分。

程序首先需要读取一行,包含两个整数 $T$(测试用例数量)和 $W$(为了使你的解法被视为正确,你需要赢得的最少游戏局数)。然后,你需要处理 $T$ 个测试用例,每个用例都是一场独立的 Zillionim 游戏。

每个测试用例通过与裁判进行交互来处理,直到一方获胜。在每次交互中,裁判首先输出一行,包含一个整数 $P$,其含义如下:

  • 如果 $1 \le P \le 10^{12} - 10^{10} + 1$,则表示 AI 移除了编号为 $P, P + 1, \dots, P + 10^{10} - 1$ 的硬币,现在轮到你操作。注意,这意味着你至少还有一个有效的操作。AI 总是进行有效操作。
  • 如果 $P = -2$,表示你上一步的操作使你赢得了当前游戏。
  • 如果 $P = -3$,表示 AI 的操作使其赢得了当前游戏。注意,在这种情况下,裁判不会发送 AI 的最后一步操作。
  • 如果 $P = -1$,表示你发送给裁判的信息格式错误或操作无效(超出范围或尝试移除不存在的硬币),这意味着你将因为操作不当而获得 Wrong Answer 判决。

在收到正整数 $P$ 后,你应该回传一行,包含一个正整数 $Q$ ($1 \le Q \le 10^{12} - 10^{10} + 1$),表示你移除了编号为 $Q, Q + 1, \dots, Q + 10^{10} - 1$ 的硬币。这些硬币中的每一枚在当前游戏中都必须是尚未被移除的。

在裁判发送 $-2$ 或 $-3$ 后,如果是最后一场游戏,裁判将终止,你的程序也应随之终止。否则,裁判将继续发送下一场游戏的第一步交互数据。裁判不会检查你赢了或输了多少场游戏,直到所有游戏都正确处理完毕。例如,如果你赢了 $T - 1$ 场游戏,但在最后一场游戏中发送了格式错误的数据,你将获得 Wrong Answer 判决,无论 $W$ 的值是多少。

在收到 $-1$ 后,你的程序应终止以接收 Wrong Answer 判决。如果程序在收到 $-1$ 后继续等待裁判,程序将会超时,导致 Time Limit Exceeded 错误。请注意,你有责任让程序正常退出并在时限内结束,以接收 Wrong Answer 判决,而不是 Runtime Error 或 Time Limit Exceeded。

随机数生成器的种子是预先确定的(且每场游戏不同)。这意味着在给定游戏中进行完全相同操作序列的两次提交,将从 AI 那里收到完全相同的操作序列。这也意味着 AI 在某场游戏中的表现,即使在伪随机生成的意义上,也不依赖于同一测试集中之前游戏的操作。

数据范围

时间限制:每个测试集 50 秒。 内存限制:1GB。 $T = 500$。 $-3 \le P \le 10^{12} - 10^{10} + 1$。 $P \neq 0$。 $P$ 代表一次有效操作或关于游戏状态的有效信息。

子任务

测试集 1(可见) $W = 300$。

测试集 2(可见) $W = 475$。

测试集 3(可见) $W = 499$。

样例

为简单起见,以下交互使用总共 50 枚硬币而不是 $10^{12}$,且每次移动移除 10 枚连续硬币而不是 $10^{10}$。规则其余部分相同。

样例交互

t, w = readline_int_list() // 读取 500 到 t,300 到 w
p = readline_int() // 读取 23 到 p;这是第一场游戏的开始。
                   // AI 已经移除了 23 到 32 号硬币(包含)。
printline 38 to stdout // 我们决定移除 38 到 47 号硬币(包含)
flush stdout
p = readline_int() // 读取 3 到 p。AI 已经移除了 3 到 12 号硬币(包含)。
printline 13 to stdout // 我们决定移除 13 到 22 号硬币(包含)
                       // (这是我们唯一剩下的操作!)
flush stdout
p = readline_int() // 读取 -2 到 p。我们赢得了第一场游戏,因为 AI 没有操作了。
p = readline_int() // 读取 32 到 p;这是第二场游戏的开始。
                   // AI 已经移除了 32 到 41 号硬币(包含)。
printline 13 to stdout // 我们决定移除 13 到 22 号硬币(包含)
flush stdout
p = readline_int() // 读取 -3 到 p。我们不知道 AI 的操作,但它让我们
                   // 没有了有效操作,所以我们输掉了第二场游戏。
p = readline_int() // 读取 10 到 p;这是第三场游戏的开始。
                   // AI 已经移除了 10 到 19 号硬币(包含)。
printline 0 to stdout // 我们选择了一个无效索引(硬币编号从 1 开始!)
flush stdout
p = readline_int() // 读取 -1 到 p -- 我们犯了一个错误!
exit // 退出以避免歧义的 TLE 错误

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.