QOJ.ac

QOJ

Limite de temps : 2 s Limite de mémoire : 1024 MB Points totaux : 100 Communication

#14297. 监狱

Statistiques

Alice 和 Bob 被无辜地判处在一家高度戒备的监狱中服刑。现在他们必须计划逃跑。为此,他们需要能够尽可能高效地进行通信(特别是,Alice 需要每天向 Bob 发送信息)。然而,他们无法见面,只能通过写在餐巾纸上的纸条来传递信息。

每天,Alice 都想给 Bob 发送一条新信息——一个介于 $0$ 和 $N - 1$ 之间的数字。每次午餐时,Alice 会得到三张餐巾纸,并在每张餐巾纸上写下一个介于 $0$ 和 $M - 1$ 之间的数字(可以重复),然后将它们留在她的座位上。接着,他们的敌人 Charly 会销毁其中一张餐巾纸,并将剩下的两张混在一起。最后,Bob 找到了剩下的两张餐巾纸,并阅读上面的数字。他必须准确地解码出 Alice 想要发送给他的原始数字。

由于餐巾纸上的空间有限,因此 $M$ 是固定的。然而,Alice 和 Bob 的目标是最大化信息吞吐量,因此他们可以自由选择尽可能大的 $N$。请通过为他们两人分别实现一种策略来帮助 Alice 和 Bob,并尝试最大化 $N$ 的值。

实现细节

由于这是一个通信问题,您的程序将在两个独立的执行过程(一个用于 Alice,一个用于 Bob)中运行,它们之间除了此处描述的方式外,无法以任何方式共享数据或进行通信。您需要实现以下三个函数:

int setup(int M);

该函数将在 Alice 的程序执行开始时被调用一次,并在 Bob 的程序执行开始时也被调用一次。它被传入 $M$,并且必须返回期望的 $N$。两次对 setup 的调用必须返回相同的 $N$。

std::vector<int> encode(int A);

该函数实现 Alice 的策略。它在调用时会被传入要编码的数字 $A$($0 \le A < N$),并且必须返回三个编码 $A$ 的数字 $W_1, W_2, W_3$($0 \le W_i < M$)。该函数总共会被调用 $T$ 次——每天一次(不同天之间的 $A$ 值可能会重复)。

int decode(int X, int Y);

该函数实现 Bob 的策略。它在调用时会被传入 encode 返回的三个数字中的两个(以某种顺序)。它必须返回与 encode 接收到的相同的 $A$ 值。该函数也将被调用 $T$ 次——与对 encode 的 $T$ 次调用相对应;它们的顺序将保持一致。所有对 encode 的调用都将在对 decode 的调用之前发生。

数据范围

  • $M \le 4300$
  • $T = 5000$

评分

对于某个特定的子任务,你获得的得分比例 $S$ 取决于该子任务中所有测试点上 setup 返回的最小 $N$。它还取决于 $N^*$,即该子任务获得满分所需的 $N$ 的目标值:

  • 如果你的解决方案在任何测试点上失败,则 $S = 0$。
  • 如果 $N \ge N^*$,则 $S = 1.0$。
  • 如果 $N < N^*$,则 $S = \max \left( 0.35 \max \left( \frac{\log(N) - 0.985 \log(M)}{\log(N^*) - 0.985 \log(M)}, 0.0 \right)^{0.3} + 0.65 \left( \frac{N}{N^*} \right)^{2.4}, 0.01 \right)$。

子任务

子任务 分数 $M$ $N^*$
1 10 700 82017
2 10 1100 202217
3 10 1500 375751
4 10 1900 602617
5 10 2300 882817
6 10 2700 1216351
7 10 3100 1603217
8 10 3500 2043417
9 10 3900 2536951
10 10 4300 3083817

样例

考虑以下 $T = 5$ 的示例。这里我们有一种编码方案:Alice 发送三个相同的数字来编码 $0$,或者发送三个不同的数字来编码 $1$。请注意,Bob 可以从 Alice 发送的三个数字中的任意两个中解码出原始数字。

执行端 函数调用 返回值
Alice setup(10) 2
Bob setup(10) 2
Alice encode(0) {5, 5, 5}
Alice encode(1) {8, 3, 7}
Alice encode(1) {0, 3, 1}
Alice encode(0) {7, 7, 7}
Alice encode(1) {6, 2, 0}
Bob decode(5, 5) 0
Bob decode(8, 7) 1
Bob decode(3, 0) 1
Bob decode(7, 7) 0
Bob decode(2, 0) 1

样例评测程序

对于样例评测程序,所有对 encodedecode 的调用都将在您程序的同一次执行中进行。此外,setup 将仅被调用一次(而在评测系统中,它会在每次执行时各被调用一次,共两次)。

输入仅为一个整数 $M$。然后它将输出您的 setup 返回的 $N$。接着,它将按照此顺序调用 encodedecode 函数 $T$ 次,其中传入的数字是在 $0$ 到 $N - 1$ 之间随机生成的,并且会随机选择将 encode 返回的三个数字中的哪两个(以及以何种顺序)传给 decode。如果您的解决方案失败,它将输出错误信息。

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.