QOJ.ac

QOJ

时间限制: 5 s 内存限制: 1024 MB 总分: 10 通信

#17388. 石头、剪刀、布 [A]

统计

Algosia 和 Bajtek 处于一种非常特殊的情况。他们每个人都有一个长度为 $n$ 的二进制字符串。他们希望尽快交换这些字符串。

困难在于,他们目前正在参加一场石头、剪刀、布锦标赛。这场比赛最近经历了一场技术革命。为了避免参赛者之间进行任何形式的交流,并完全专注于选手策略的随机性,组织者决定将参赛者完全隔离,并在他们之间设置一个计算机系统。每位参赛者声明自己的出招,只有在此之后才会揭晓该轮的结果。

石头、剪刀、布的比赛规则如下:

  • 比赛由多轮组成。
  • 在每一轮中,每位玩家从三个符号中选择一个:布 (P)、石头 (K) 或剪刀 (N)。
  • 然后比较这些符号。如果玩家选择了相同的符号,则该轮平局,无人得分。否则,拥有更强符号的玩家获得 1 分(布胜过石头,石头胜过剪刀,剪刀胜过布)。
  • 第一个比对手多出 2 分的玩家赢得比赛。
  • 比赛持续进行,直到其中一名玩家赢得比赛。

Algosia 和 Bajtek 希望在比赛结束前互相了解对方的字符串。他们还希望进行的轮数尽可能少,以免耗尽观察者和观众的耐心。请编写一个程序来帮助他们。你必须解决 $t$ 个独立测试用例的问题。

交互

这是一个交互式任务。你的程序将运行两个副本——一个代表 Algosia,另一个代表 Bajtek。每次运行的输入第一行都会收到单词 AlgosiaBajtek,这决定了该程序副本代表哪个人。

两种情况下的输入格式完全相同。输入的第一行包含单词 AlgosiaBajtek。第二行包含两个数字 $n$ 和 $t$ ($1 \le n \le 5000, 1 \le t \le 5$),分别表示 Algosia 和 Bajtek 想要互相发送的二进制字符串的长度以及测试用例的数量。随后进行 $t$ 次程序间的交互。

在每个测试用例的第一行,两个程序都将收到一个长度为 $n$ 的字符串,仅由字符 01 组成。读取各自的字符串后,Algosia 和 Bajtek 开始游戏。在每一轮中,玩家首先输出一行包含其出招的内容,用字符 $c \in \{P, K, N\}$ 表示,然后从输入中读取一行,其中包含以相同格式表示对方玩家出招的字符。单个测试用例中的最大轮数为 20000。超过此限制将导致“错误答案”判决。

要结束测试用例,必须输出一行包含字符 !(感叹号)、一个空格以及随后的长度为 $n$ 的字符串,该字符串仅由字符 01 组成。对于 Algosia,这应该是 Bajtek 的字符串,而对于 Bajtek,这应该是 Algosia 的字符串。输出结果后,程序应立即进入下一个测试用例(即读取包含要传递的字符串的行),或者如果这是最后一个测试用例,则结束运行。

输出答案后,必须清空输出缓冲区,例如通过调用 cout.flush()fflush(stdout)

样例

输入格式 1

Algosia
5 2
10010
P
K
P
! 00001
00010
P
K
! 10001

输出格式 1

P
K
P
P
! 00001
P
K
! 10001

说明

上述交互对应于第一个示例测试(名为 0a)。在所有其他测试中(包括第二个示例测试 0b),满足 $t = 5, n = 5000$。如果在一轮之后,任何玩家比对手多出 2 分,程序将立即结束并给出“错误答案”判决。两个程序同时启动。程序运行时间测量为从交互器开始到结束的实际时间。优势不会在测试用例之间传递。在每个测试用例开始时,两名玩家都从 0 分开始(无论前一个测试用例以什么结果结束)。

子任务

测试集由一组组成,最多可获得 10 分。设 $m$ 为单个测试中所有测试用例进行的总轮数最大值。给定测试的分数根据以下规则确定:

$m \le$ 分数
20000 1
16250 2
10000 3
8750 4
6250 5
5500 6
5250 7
5125 8
5050 9
5000 10

提交的最终得分为所有测试中的最低得分。

本地测试

为了方便本地测试,我们提供了一个交互器(pknsoc.cpp)。你可以使用以下命令运行它:

python3 pknrun.py [程序1] [程序2]

其中 [程序1][程序2] 是编译后的可执行文件。交互器将模拟两名玩家之间的通信,并根据上述规则验证游戏的合法性。

公平竞争原则

禁止通过游戏过程以外的任何方式在程序之间进行通信,例如通过一个程序延迟发送出招而另一个程序读取时钟。如果评审团发现程序之间存在非法通信尝试,则提交内容可能会被删除,在严重的情况下,可能会做出取消整个比赛资格的决定。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download
#1354EditorialOpen题解Milmon2026-03-31 16:24:53View

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.