QOJ.ac

QOJ

実行時間制限: 1 s メモリ制限: 4096 MB 満点: 100 インタラクティブ

#13543. 核心计算机

統計

Coreputer 是一台全新的计算机器,拥有 $N$ 个核心,编号从 $0$ 到 $N - 1$。最近的维护工作显示,其中一些核心出现了故障。目前尚不清楚具体哪些核心出现了故障,但已知至少有一个核心是故障的。

为了找出故障核心,Coreputer 可以运行诊断扫描。在每次扫描中,用户可以标记一组(可能为空)不同的核心 $T[0], \dots, T[l - 1]$,其中 $0 \le l \le N$。其余核心为未标记核心。随后,Coreputer 会对标记的核心和未标记的核心进行基准测试。最后,它会报告哪一组包含的故障核心数量更多,或者报告两组包含的故障核心数量相等。注意,空组包含 $0$ 个故障核心。

你的任务是通过在 Coreputer 上运行诊断扫描来找出故障核心。

实现细节

你需要实现以下过程:

int[] malfunctioning_cores(int N)
  • $N$:核心数量。
  • 该过程应返回一个数组 $c = [c[0], c[1], \dots, c[N - 1]]$,其中对于每个 $0$ 到 $N - 1$ 之间的 $i$,如果核心 $i$ 发生故障,则 $c[i] = 1$,否则 $c[i] = 0$。
  • 该过程在每个测试用例中仅被调用一次。

上述过程可以调用以下过程:

int run_diagnostic(int[] T)
  • $T$:一个包含不同核心编号的数组。
  • 该过程返回:
    • $1$:如果标记的核心中故障核心的数量多于未标记的核心;
    • $0$:如果标记的核心和未标记的核心中故障核心的数量相等;
    • $-1$:如果标记的核心中故障核心的数量少于未标记的核心。
  • 在每个测试用例中,该过程最多可被调用 $32$ 次。

评测程序不是自适应的,这意味着故障核心的集合在调用 malfunctioning_cores 之前就已经确定。

样例

输入格式 1

4
0 0 1 0

输出格式 1

0 0 1 0
3

说明

考虑 $N = 4$ 个核心,且只有核心 $2$ 发生故障的情况。过程 malfunctioning_cores 可能会按如下方式调用 run_diagnostic

  1. run_diagnostic([0]) 返回 $-1$(标记的核心中没有故障核心,而有一个未标记的核心发生故障)。
  2. run_diagnostic([1, 2]) 返回 $1$。
  3. run_diagnostic([2]) 返回 $1$。

在第三次调用返回 $1$ 后,可以明确至少有一个标记的核心(即核心 $2$)是故障的。但此时,未标记的故障核心数量必须为零,因此我们得出结论,没有其他核心发生故障。

数据范围

  • $2 \le N \le 16$

子任务

  1. (20 分) $N = 2$
  2. (40 分) 故障核心的数量为偶数。
  3. (40 分) 无附加限制。

如果任何测试用例中对 run_diagnostic 的调用不符合“实现细节”中描述的约束,或者 malfunctioning_cores 的返回值不正确,则该子任务的得分将为 $0$。

在每个子任务中,你可以获得部分分数。设 $q$ 为所有测试用例中调用 run_diagnostic 的最大次数。根据下表,你将获得该子任务得分的相应百分比:

条件 百分比
$24 < q \le 32$ $50\%$
$18 < q \le 24$ $75\%$
$q \le 18$ $100\%$

样例评测程序

样例评测程序按以下格式读取输入:

  • 第 1 行:$N$
  • 第 2 行:$M[0] \ M[1] \ \dots \ M[N - 1]$

其中对于每个 $0$ 到 $N - 1$ 之间的 $i$,如果核心 $i$ 发生故障,则 $M[i] = 1$,否则 $M[i] = 0$。

在调用 malfunctioning_cores 之前,样例评测程序会检查是否至少有一个故障核心。如果不满足此条件,它将打印消息 No Malfunctioning Cores 并终止。

如果样例评测程序检测到协议违规,输出将为 Protocol Violation: <MSG>,其中 <MSG> 是以下错误消息之一:

  • invalid array:在调用 run_diagnostic 时,数组 $T$
    • 包含超过 $N$ 个元素,或
    • 包含的元素不是 $0$ 到 $N - 1$ 之间的整数,或
    • 包含重复元素。
  • too many calls:调用 run_diagnostic 的次数超过了 $32$ 次。

否则,设 malfunctioning_cores 返回的数组元素为 $c[0], c[1], \dots, c[N - 1]$。样例评测程序的输出格式如下:

  • 第 1 行:$c[0] \ c[1] \ \dots \ c[N - 1]$
  • 第 2 行:调用 run_diagnostic 的次数

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.