P1059新水濯旧隍(moat)
本题为交互题。
【题目背景】
龙华于旸,红旗漫卷,新水濯旧隍。
【题目描述】
前朝遗老的王宫里,有 个宫室,其中有一个宫室是明光殿,记为 号宫室,这 个宫室由 条宫内道路连通,也就是说,任意两个宫室 都能通过若干条宫内道路互相到达。第 个宫室中收藏着价值 的宝藏。每个 都是正整数。
旧王朝被推翻后,清洗者和斥候来到了明光殿,决定探测整个王宫。前朝留下的宫图记录了所有宫内道路,却没有记载任何一处藏宝量。因此,在行动开始前,王宫的结构是已知的,而每个 都是未知的。
以明光殿为根,宫室 的深度定义为从明光殿前往宫室 时经过的宫室数量。保证每个宫室至多与两个深度比它大 的宫室直接相连。令 表示所有宫室深度的最大值。
行动共进行 轮。每轮行动依次分为探查阶段与清洗阶段。
对于一个宫室 ,将宫室 与所有从明光殿前往时必须经过宫室 的宫室共同组成的区域称为宫室 的辖域。在探查阶段,你可以让斥候调查任意一个宫室 ,斥候会报告宫室 的辖域中当前剩余的藏宝量之和。你可以根据此前得到的所有报告决定下一次调查的位置,也可以随时结束本轮的探查阶段。
随后进入本轮的清洗阶段。你必须让清洗者选择一个此前没有清洗过的宫室 。清洗者会取得宫室 中的全部财宝,并将这个宫室的藏宝量清零。此后,本轮行动结束,下一轮调查所得的藏宝量之和也会随之改变。
而你作为领导者,需要根据斥候不断送回的消息,为清洗者依次确定 个互不相同的目标,使得最终获取的藏宝量尽可能多。视你获取的藏宝量多少,你将会获得不同的评价。
【实现细节】
选手不需要,也不应实现 main 函数。
选手需要确保提交的程序包含头文件 moat.h,即在程序开头加入以下代码:
#include "moat.h"选手需要在提交的程序源文件 moat.cpp 中实现以下两个函数:
void Init(int c, int T);- 分别表示测试点编号与测试数据组数。 表示该测试点为样例。
- 对于每个测试点,该函数会在程序开始运行时被交互库调用恰好一次。
void Play(int c, int n, int b, std::vector<int> parent);- 分别表示测试点编号、宫室数量与行动轮数。
parent的长度为 。其中parent[1]等于 ,对于 ,parent[u]表示从宫室 前往明光殿时经过的第一个宫室。- 选手可以由
parent得知完整的王宫结构。每个宫室的藏宝量不会传入该函数。 - 对于每组测试数据,该函数会被交互库调用恰好一次。
在 Play 函数中,选手可以调用下列函数。
long long Scout(int u);- 该函数表示让斥候调查宫室 ,其中 。
- 该函数返回宫室 的辖域中当前剩余的藏宝量之和。
- 该函数只能在一轮行动的探查阶段调用。
- 设王宫的高度为 。选手需要确保交互库每次调用
Play时,调用该函数的次数不超过 。
long long Clean(int u);- 该函数结束当前一轮的探查阶段,并让清洗者在清洗阶段清洗宫室 ,其中 。
- 宫室 不能在此前的清洗阶段中被选择过。
- 该函数返回本次取得的藏宝量。调用结束后,宫室 的藏宝量变为 ,并立即开始下一轮的探查阶段。
- 每组测试数据中,该函数必须恰好调用 次。第 次调用结束后,
Play函数应当结束运行。
交互库运行所需的时间与空间均计入本题的时间与空间限制。
【测试程序方式】
选手可以在本题目录下使用如下命令编译得到可执行文件:
g++ grader.cpp moat.cpp -o moat -O2 -std=c++14 -static对于编译得到的可执行文件 moat:
-
可执行文件将从标准输入读入以下格式的数据:
- 第一行包含两个非负整数 ,分别表示测试点编号与测试数据的组数。 表示该测试点为样例。
- 接下来对于每组测试数据,第一行包含两个正整数 。
- 第二行包含 个正整数 。
- 接下来 行,每行包含两个正整数 ,表示宫室 之间有一条宫内道路。
-
若所有交互均合法,可执行文件将输出以下格式的数据至标准输出:
- 输出的第一行为
Finished!。 - 接下来 行中,第 行形如
Case i: treasure = s, score ratio = p%,其中 表示第 组测试数据中取得的藏宝量, 表示该组测试数据的得分百分比。 - 输出的最后一行为
Score ratio: p%,其中 表示整个测试点的得分百分比。
- 输出的第一行为
-
若发生非法调用,可执行文件会向标准错误流输出错误信息并终止程序。
【样例 1 输入】
0 17 24 5 2 6 3 7 11 21 32 42 53 63 7【样例 1 输出】
Finished!Case 1: treasure = 13, score ratio = 100.000000%Score ratio: 100.000000%【说明/提示】
【样例 1 解释】
样例输出对应一种分别清洗宫室 与宫室 的策略。两次清洗依次取得 与 的藏宝量,因此最终共取得 的藏宝量。
不同的合法策略可能产生不同的样例输出。
【样例 2】
见选手目录下的 。
该组样例符合测试点 的数据范围。
【样例 3】
见选手目录下的 。
该组样例符合测试点 的数据范围。
【样例 4】
见选手目录下的 。
该组样例符合测试点 的数据范围。
【样例 5】
见选手目录下的 。
该组样例符合测试点 的数据范围。
本题为成果评分交互题,附加样例只提供隐藏输入。测试程序的输出由选手程序采用的策略决定。
【数据范围】
对于 的数据,保证 ,,,,每个宫室至多与两个深度比它大 的宫室直接相连,王宫的高度 。对于同一个测试点,保证 。
| 测试点编号 | 分值 | 特殊性质 | ||
|---|---|---|---|---|
| 无 | ||||
| 无 | ||||
| A | ||||
| 无 |
特殊性质 A:所有宫内道路构成一条以明光殿为一端的链。
【评分方式】
注意:
- 选手不应当通过非法方式获取交互库的内部信息,如试图直接读取各个宫室的藏宝量,或直接与标准输入、输出流进行交互。此类行为将被视为作弊。
- 交互库不是适应性的。每次调用
Play时,王宫结构与各个宫室最初的藏宝量已经确定。只有选手调用Clean时,相应宫室的藏宝量才会按照【题目描述】中的规则变为 。 - 最终的评测交互库与本地测试交互库的实现不同。
对于一组交互合法的测试数据,记所有宫室最初的藏宝量之和为 ,选手程序最终获取的藏宝量为 。该组测试数据的得分比例为
其中, 表示该组测试数据的得分比例。若 ,则该组测试数据取得对应的全部分值。若 ,则该组测试数据取得对应分值的 倍。
若一个测试点包含 组测试数据,记第 组测试数据的得分比例为 ,则该测试点的得分比例 为
可以等价地认为,测试点的分值被平均分配给其中的 组测试数据,再分别乘以对应的得分比例。若选手程序在任意一组测试数据中发生非法调用,则整个测试点得 分。
记表中该测试点的分值为 ,则取整前的实际得分为 。最终得分保留两位小数,并采用向下取整,也就是
【题解】
已公开 1 篇题解,官方题解会优先显示。