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:
run_diagnostic([0])返回 $-1$(标记的核心中没有故障核心,而有一个未标记的核心发生故障)。run_diagnostic([1, 2])返回 $1$。run_diagnostic([2])返回 $1$。
在第三次调用返回 $1$ 后,可以明确至少有一个标记的核心(即核心 $2$)是故障的。但此时,未标记的故障核心数量必须为零,因此我们得出结论,没有其他核心发生故障。
数据范围
- $2 \le N \le 16$
子任务
- (20 分) $N = 2$
- (40 分) 故障核心的数量为偶数。
- (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的次数