#P11300. [NOISG 2021 Finals] Archaeologist
[NOISG 2021 Finals] Archaeologist
题目背景
滥用本题评测将被封号。
一组考古学家正在探索一个由房间和双向通道组成的遗迹。遗迹中的房间编号为 到 ,且满足以下条件:
- 遗迹中不存在环。
- 所有房间均可从入口房间(编号为 )到达。
考古学家无法回头(即不能沿已走过的通道返回),也无法得知其他考古学家的数量或位置。然而,他们可以通过调整房间的光照等级来标记房间的状态。每个房间的光照等级初始为 ,可以被设置为 到 之间的任意值。
任务是设计一种策略,使得所有房间均能被 名考古学家探索到。
题目描述
为了完成本题,你需要在程序开头定义函数 void set_light(int level)
,你无需引入其他头文件。
实现以下函数:
void archaeologist(int N, int K, int L, vector<int> map, int lightlevel, vector<int> paths)
N
:房间总数。K
:考古学家总数。L
:光照等级的最大值。map
:长度为 的数组,其中map[0]
,对于 ,map[i]
表示房间 直接连接的父房间编号。lightlevel
:当前房间的光照等级。paths
:当前房间中其他通道终点的光照等级列表(顺序随机,不包括返回的通道)。
函数行为
- 每次调用
archaeologist
表示一位考古学家从房间 出发,依次探索多个房间,直到到达目标房间。 - 考古学家可以调用以下辅助函数完成任务:
void set_light(int level)
:- 设置当前房间的光照等级。
- 参数
level
为新的光照等级,需满足level
。
(int, int[]) take_path(int corridor)
:- 选择通道进入相邻房间。
- 参数
corridor
表示通道索引。 - 返回值包含两个数据:
- 新房间的编号。
- 新房间中其他通道终点的光照等级列表(顺序随机,不包括返回的通道)。
注意事项
- 每次调用
archaeologist
仅代表一位考古学家的行为,不能共享全局变量。 - 程序不能通过调用
exit()
提前终止。
输入格式
- 第一行包含三个整数 。
- 第二行包含 个整数,表示
map[i]
的值()。
输出格式
程序通过调用辅助函数完成所有探索任务,无需额外输出。
7 4 2
0 0 1 1 2 2
无
提示
【数据范围】
- 等于无其他出口的房间数量(死胡同房间)。
- 大于等于房间 到最远房间的通道数。
子任务编号 | 分值 | 限制条件 |
---|---|---|
,且 map[i] 对所有 成立 |
||
map 为完全二叉树 |
||
map 除 外所有元素都至少出现了两次 |
||
无额外限制 |