Koala 创建了一个新游戏并向你发起了挑战!她首先放置了 $N$ 个物品,编号从 $0$ 到 $N-1$。然后,她秘密地为每个物品分配了一个 $1$ 到 $N$ 之间的整数值,使得没有两个物品被分配相同的值。物品 $i$ 被分配的值为 $P_i$。她向你发起挑战,要求你识别序列 $P = P_0, P_1, \dots, P_{N-1}$ 的某些属性。
为了做到这一点,你需要请求 Koala 进行一系列的回合。在每一回合中,你会得到 $W$ 个蓝色石头,Koala 会得到 $W$ 个红色石头。你先手,将你的一些(或全部)石头放置在某些你选择的物品旁边。Koala 看到你的安排后,也会做出类似的反应,将她的一些(或全部)石头放置在某些物品旁边。随后,Koala 赢得所有在其旁边放置的红色石头数量严格多于蓝色石头数量的物品。Koala 总是会分配她的石头,以使她赢得的物品的价值之和最大化。如果存在多种方式可以达到此目的,她会选择一种使她赢得的物品总数最大化的方式。如果仍然存在多种方式,她会随机选择其中一种。
Koala 非常懒,如果你让她进行太多回合,她就会睡着。你的任务是通过尽可能少的回合来识别 Koala 序列 $P$ 的模式。
任务
在这个任务中,你需要实现四个函数:minValue、maxValue、greaterValue 和 allValues。每个函数都要求你识别序列 $P$ 的不同属性。强烈建议你使用你所用语言的模板实现作为解决方案的起点。请注意,即使你只尝试部分子任务,你也必须为所有四个函数提供实现(尽管其中一些实现可以是空的)。你的程序不得从标准输入读取、向标准输出写入或与任何文件进行交互。
在每个函数中,参数 $N$ 是游戏中的物品数量,参数 $W$ 是你在每一回合中与 Koala 共同使用的石头数量。
minValue(N, W)--- 此函数应返回具有最小值的物品编号 $i$,即 $P_i = 1$。maxValue(N, W)--- 此函数应返回具有最大值的物品编号 $i$,即 $P_i = N$。greaterValue(N, W)--- 此函数应比较物品 $0$ 和 $1$ 的值,并返回较大物品的编号。具体来说,如果 $P_0 > P_1$ 则返回 $0$,否则返回 $1$。allValues(N, W, P)--- 此函数应确定整个序列 $P$ 并将其放入提供的数组 $P$ 中:具体来说,对于所有 $0 \le i \le N-1$,P[i]应包含物品 $i$ 的值。
在每个测试用例中,评测程序将调用这四个函数中的恰好一个,且可能调用一次或多次。每次函数调用都应被视为一个独立的游戏。具体调用哪个函数以及最大调用次数取决于子任务(见下文)。你可以假设 Koala 在每次函数调用前已经固定了她的序列,并且在函数执行期间该序列不会改变。在下一次函数调用之前,她可能会更改她的序列。
每个函数的实现都应调用 playRound 函数以获取有关 Koala 序列的信息。
playRound(B, R)--- 请求 Koala 与你进行一回合游戏。- 数组
B描述了你在每个物品旁边放置了多少个蓝色石头。具体来说,对于所有 $0 \le i \le N-1$,物品 $i$ 旁边将放置B[i]个蓝色石头。每个B[i]必须是非负整数,且总和B[0] + B[1] + ... + B[N-1]不得超过 $W$。 - 评测程序将填充提供的数组
R以描述 Koala 的响应。具体来说,对于所有 $0 \le i \le N-1$,Koala 将在物品 $i$ 旁边放置R[i]个红色石头。 - 每个子任务都规定了你在每场游戏中调用
playRound的次数上限。请注意,使用少于此限制的调用次数可能会获得更高的分数(见下文)。
- 数组
子任务
子任务 1 [4 分]
- 在此子任务中,评测程序将仅调用
minValue函数。此函数在每个测试用例中最多被调用 100 次。 - $N = 100$。
- $W = 100$。
- 每场游戏最多可调用
playRound2 次。
子任务 2 [最高 15 分]
- 在此子任务中,评测程序将仅调用
maxValue函数。此函数在每个测试用例中最多被调用 100 次。 - $N = 100$。
- $W = 100$。
- 每场游戏最多可调用
playRound13 次。 - 此子任务的得分取决于该测试用例中所有游戏中调用
playRound的最大次数 $C_{\max}$。具体得分如下:- 若 $C_{\max} \le 4$,得 15 分;
- 若 $5 \le C_{\max} \le 13$,得 7 分。
子任务 3 [最高 18 分]
- 在此子任务中,评测程序将仅调用
greaterValue函数。此函数在每个测试用例中最多被调用 1100 次。 - $N = 100$。
- $W = 100$。
- 每场游戏最多可调用
playRound14 次。 - 此子任务的得分取决于该测试用例中所有游戏中调用
playRound的最大次数 $C_{\max}$。具体得分如下:- 若 $C_{\max} \le 3$,得 18 分;
- 若 $C_{\max} = 4$,得 14 分;
- 若 $C_{\max} = 5$,得 11 分;
- 若 $6 \le C_{\max} \le 14$,得 5 分。
子任务 4 [10 分]
- 在此子任务中,评测程序将仅调用
allValues函数。此函数在每个测试用例中恰好被调用一次。 - $N = 100$。
- $W = 200$。
- 每场游戏最多可调用
playRound700 次。
子任务 5 [最高 53 分]
- 在此子任务中,评测程序将仅调用
allValues函数。此函数在每个测试用例中恰好被调用一次。 - $N = 100$。
- $W = 100$。
- 每场游戏最多可调用
playRound3200 次。 - 此子任务的得分取决于调用
playRound的次数 $C$。具体得分如下:- 若 $C \le 100$,得 53 分;
- 若 $101 \le C \le 3200$,得 $\lfloor 53 - 8 \log_2(C/100) \rfloor$ 分,其中 $\lfloor x \rfloor$ 是小于或等于 $x$ 的最大整数。特别地,若 $C = 3200$,你的方案将得 13 分。
评分
- 在每个测试用例中,你的程序必须始终在任务的时间和内存限制内运行。这包括评测程序在设置、拆除和响应
playRound函数调用时所消耗的时间和内存。 - 如果调用
playRound时传入了无效的数组B,或者在测试用例的任何游戏中调用playRound的次数超过了硬性限制,则整个测试用例将被标记为“不正确”,得 0 分。 - 如果函数未能正确确定特定游戏中 Koala 序列 $P$ 的所需属性,则整个测试用例将被标记为“不正确”,得 0 分。
- 子任务 4 和子任务 5 都要求你实现
allValues函数,但 $W$ 的值不同。你可以在实现中使用这一点来区分这两个子任务——详情请参阅你所用语言的模板实现。 - 此任务最多可提交 60 次,两次提交之间的最小间隔为 2 分钟。
样例
考虑以下序列 $P$:
| $i$ | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| $P_i$ | 5 | 3 | 2 | 1 | 6 | 4 |
以下是一系列对 playRound 的示例调用,以及评测程序对每次调用的有效响应(注意,对于任何给定的 playRound 调用,可能存在不止一种有效响应)。
| $W$ | 示例函数调用 | 可能的评测程序响应 | 说明 |
|---|---|---|---|
| 6 | playRound([0, 3, 0, 2, 1, 0], R) |
R = [1, 1, 1, 0, 2, 1] |
你分别在物品 1、3 和 4 旁边放置了 3、2 和 1 个蓝色石头,在物品 0、2 和 5 旁边没有放置石头。作为回应,Koala 在物品 0、1、2 和 5 旁边放置了 1 个红色石头,在物品 4 旁边放置了 2 个红色石头,在物品 3 旁边没有放置红色石头。因此,她赢得了物品 0、2、4 和 5,总价值为 $5 + 2 + 6 + 4 = 17$,这是可能的最大值。 |
| 6 | playRound([1, 2, 3, 1, 2, 0], R) |
无效函数调用。你的程序被终止并标记为“不正确”,此测试用例得 0 分。 | 你放置了 $1 + 2 + 3 + 1 + 2 = 9 > 6 = W$ 个石头,这是无效的。 |
| 12 | playRound([1, 2, 3, 1, 2, 0], R) |
R = [2, 3, 0, 2, 3, 1] |
你不需要放置全部 $W$ 个蓝色石头,Koala 也不需要放置全部 $W$ 个红色石头。 |
| 6 | playRound([0, 1, 0, 0, 1, 0], R) |
R = [1, 0, 1, 1, 2, 1] |
如果 Koala 有多种可能的响应方式能使她的总价值最大化,她会选择一种使她赢得的物品总数最大化的方式,因此 R = [1, 2, 0, 0, 2, 1] 不是一个有效的响应。 |
评测程序在提交时会按照给定的顺序提供“样例数据”中每个函数的反馈(每个测试用例恰好一个)。在这些测试用例中,你最多可以调用 playRound 3200 次。
| # | 评测程序调用 | 期望返回值 | 说明 |
|---|---|---|---|
| 1 | minValue(6, 6) |
3 | $P_3 = 1$,因此物品 3 具有最小值。 |
| 2 | maxValue(6, 6) |
4 | $P_4 = 6 = N$,因此物品 4 具有最大值。 |
| 3 | greaterValue(6, 6) |
0 | $P_0 = 5 > 3 = P_1$,因此物品 0 的值大于物品 1。 |
| 4 | allValues(6, 12, P) |
无,P = [5, 3, 2, 1, 6, 4] |
allValues 函数没有返回值,而是将正确的值放入给定的数组 P 中。 |
| 5 | allValues(6, 6, P) |
无,P = [5, 3, 2, 1, 6, 4] |
同上一个函数调用。 |
样例评测程序
样例评测程序按以下格式从标准输入读取: 第 1 行:两个整数 $F, G$; 第 2 行至 $G+1$ 行:每行包含两个整数 $N, W$,后跟 $N$ 个整数 $P_0, P_1, \dots, P_{N-1}$,描述单个游戏。
整数 $F$ 决定了样例评测程序将调用哪个函数:
| $F$ | 调用函数 |
|---|---|
| 1 | minValue |
| 2 | maxValue |
| 3 | greaterValue |
| 4 | allValues |
整数 $G$ 决定了指定函数将被调用多少次。随后的每一行描述了一个带有 Koala 序列的游戏。
样例评测程序将为每次函数调用向标准输出写入两行。第一行包含调用 playRound 的次数。
如果 $F = 4$,第二行包含你的 allValues 函数实现放入数组 P 中的内容;
否则,如果 $F = 1, 2$ 或 $3$,第二行包含一个整数:相应函数的返回值。
例如,“样例数据”中的第四个测试用例(调用 allValues,其中 $N = 6$ 且 $W = 12$)可以用以下样例输入文件描述:
4 1 6 12 5 3 2 1 6 4