QOJ.ac

QOJ

Time Limit: 10 s Memory Limit: 1024 MB Total points: 32 Interactive

#12437. 渗透测试

Statistics

你有 $N$ 支圆珠笔。你知道每支笔的墨水单位数都是 $0$ 到 $N-1$ 之间的一个不同整数,但这些笔是随机给你的,因此你不知道哪支笔对应哪个数值。

你即将前往南极(那里没有笔),你的行李箱只能装下两支笔,但你知道你需要写很多重要的明信片。具体来说,你选择的两支笔的墨水总量必须至少为 $N$ 个单位。

获取笔的信息的唯一方法是选择一支笔并尝试用它写字。你要么成功,此时该笔的墨水会减少一个单位(现在可能为空),要么失败,这意味着该笔已经没有墨水了。你可以多次重复此操作,使用同一支笔或不同的笔。

最终,你必须选择两支笔带去旅行,如果这两支笔中剩余的墨水总量至少为 $N$ 个单位,则视为成功。

你将获得 $T$ 个测试用例,你必须在其中至少 $C$ 个测试用例中取得成功。注意,本题中的所有测试集都是可见的。

输入格式

这是一个交互式问题。请确保你已阅读 FAQ 中关于交互式问题的相关信息。

首先,你的程序应读取一行,包含三个整数 $T$、$N$ 和 $C$:测试用例的数量、笔的数量以及你必须成功的最小测试用例数。(注意,$N$ 的值对于所有测试集都是相同的,提供该值仅为了方便;详见数据范围部分。)

然后,你的程序需要同时处理所有 $T$ 个测试用例(这样做是为了减少你的解决方案与评测程序之间的往返次数)。交互按轮次进行。

在每一轮开始时,你的程序必须打印一行,包含 $T$ 个整数:第 $i$ 个整数是你想要在第 $i$ 个测试用例中尝试书写的笔的编号,如果你不想在这一轮中对该测试用例进行书写,则输出 $0$。笔的编号从 $1$ 到 $N$。

请注意,在打印完所有 $T$ 个整数后才刷新输出缓冲区,而不是在打印每个整数后都刷新,因为刷新本身消耗的时间可能会导致超时(Time Limit Exceeded)。

评测程序会返回一行,包含 $T$ 个整数:第 $i$ 个整数是该轮中第 $i$ 个测试用例消耗的墨水量。如果第 $i$ 个测试用例中的书写成功,则该值为 $1$。否则,该值为 $0$,这可能意味着你尝试在第 $i$ 个测试用例中书写但所选的笔已无墨水,或者你根本没有在第 $i$ 个测试用例中尝试书写。

你最多可以参与 $N \times (N+1)/2$ 轮。注意,这足以确定所有笔是否都已耗尽墨水。

当你的程序准备好提交所有测试用例的答案时,必须打印一行包含 $T$ 个 $0$。这一行不计入轮数限制,评测程序也不会发送响应。

然后,你的程序必须打印另一行,包含 $2 \times T$ 个整数:该行中第 $(2 \times i - 1)$ 个和第 $(2 \times i)$ 个整数是你为第 $i$ 个测试用例选择带去南极的两支笔的编号。评测程序不会发送响应,之后你的程序必须无错误地终止。

如果评测程序在任何时刻收到来自你程序的意外输出,它将打印单个数字 $-1$ 且不再输出任何内容。如果你的程序在收到 $-1$ 后继续等待评测程序,你的程序将会超时,导致超时错误。请注意,你有责任让你的程序及时退出以接收“答案错误”(Wrong Answer)判决,而不是超时错误。通常情况下,如果超过内存限制或程序出现运行时错误,你将收到相应的判决。

你可以假设笔是随机分配给你的。这些顺序是针对每个测试用例和每次提交独立且均匀随机选择的。因此,即使你提交完全相同的代码两次,评测程序也会使用不同的随机顺序。

数据范围

时间限制:每个测试集 90 秒。 内存限制:1GB。 $N = 15$。

测试集 1(可见判决) $T = 20000$。 $C = 10900$ ($C=0.545 \times T$)。

测试集 2(可见判决) $T = 20000$。 $C = 12000$ ($C=0.6 \times T$)。

测试集 3(可见判决) $T = 100000$。 $C = 63600$ ($C=0.636 \times T$)。

样例

样例输入 1

2 5 1
1 0
0 1
0 1

样例输出 1

4 5
4 3
0 2
0 0
3 4 3 4

说明

以下是上述交互的解释:

// 读取 2 到 t,5 到 n,1 到 c。 t, n, c = readline_int_list() // 评测程序秘密选择了每支笔的墨水单位数: // 测试用例 1: 2 0 4 1 3 // 测试用例 2: 1 3 2 4 0 // 我们在测试用例 1 中使用第 4 支笔书写,在测试用例 2 中使用第 5 支笔书写。 printline 4 5 to stdout flush stdout // 读取 1 0,因为测试用例 1 中的第 4 支笔还有墨水, // 但测试用例 2 中的第 5 支笔没有了。 a1, a2 = readline_int_list() // 我们再次在测试用例 1 中使用第 4 支笔书写,在测试用例 2 中使用第 3 支笔书写。 printline 4 3 to stdout flush stdout // 读取 0 1。 a1, a2 = readline_int_list() // 这次我们只在测试用例 2 中使用第 2 支笔书写。 printline 0 2 to stdout flush stdout // 读取 0 1。 a1, a2 = readline_int_list() // 我们决定准备好回答了。 printline 0 0 to stdout flush stdout // 我们在两个测试用例中都带上第 3 支和第 4 支笔去南极。 printline 3 4 3 4 to stdout flush stdout // 在测试用例 1 中,第 3 支和第 4 支笔的剩余墨水量分别为 4 和 0,且 4+0<5, // 所以我们没有成功。 // 在测试用例 2 中,第 3 支和第 4 支笔的剩余墨水量分别为 1 和 4,且 1+4≥5, // 所以我们成功了。 // 我们在 2 个测试用例中成功了 1 个,因为 c=1,这已经足够了。 exit

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.