#P11315. [RMI 2021] 速通 / Speedrun
[RMI 2021] 速通 / Speedrun
题目背景
译自 9th Romanian Master of Informatics, RMI 2021 D1T3。。
评测时,不要引入头文件。在文件头加入如下的语句:
void setHintLen(int);
void setHint(int,int, bool);
int getLength();
bool getHint(int);
bool goTo(int);
题目描述
这是一道通信题。
你在一棵 个节点的树上,从某个节点出发跑酷。
你不知道这棵树的具体形态,只知道现在自己在哪个节点。你在点 时,唯一能做的就是选择一个 ,尝试走到 。如果 这条边存在,你会走到 ;否则你将留在原地。
需要注意的是,你最多能试错 次。也就是说,如果你超过 次选择了一条不存在的边,就失败了。
当你经过每个节点至少一次时,我们说你速通成功。
现在有一个作弊的机会。你可以在每个节点放一个长度为 的 串,当你在某个节点时,可以读取那个节点上 串的信息。需要注意的是,在放置 串的时候你是知道这棵树的形态的,但是你不知道自己跑酷时的出发点。
请你找到一种设置信息和速通的方式,使得速通成功。
实现细节
你不需要,也不应该实现 main 函数。
你需要实现以下的函数:
void assignHints(int subtask, int N, int A[], int B[]);
void speedrun(int subtask, int N, int start);
你可以调用以下的函数:
void setHintLen(int l);
void setHint(int i, int j, bool b);
int getLength();
bool getHint(int j);
bool goTo(int x);
第一次运行
第一次运行用于确定每个节点上的信息。
交互库将会调用 assignHints
函数恰好一次。参数的含义:
subtask
:子任务编号。N
:树的节点数量。A[]
,B[]
:长度为 的整数数组,含义为对于每个 , 间有一条边连接。
随后,你需要立刻调用 setHintLen
函数恰好一次。传入正整数 l
表示你的 串的长度。
串起初全为 。
接下来,你可以多次调用 setHint
,其中 ,表示将节点 的 串的第 位设置成 b
。
在第一次运行中,禁止调用 getLength
,getHint
和 goTo
。
第二次运行
交互库将会调用 speedrun
函数恰好一次。参数的含义:
subtask
:子任务编号。N
:树的节点数量。start
:你的初始位置。
调用 getLength
来获得 串的长度。
当你在节点 时,调用 getHint(j)
来获得当前节点上 串的第 位。
可以调用 goTo
来尝试移动一步。如果成功,返回值为 true
;否则返回值为 false
。
在第二次运行中,禁止调用 setHint
和 setHintLen
。
提示
对于 的数据,保证 。
令 为 goTo
函数返回 False
的最大次数, 为 的最大值。超出限制,得 分。
子任务编号 | 树的形态 | 计分方式 | 得分 | ||
---|---|---|---|---|---|
I | |||||
菊花图 | |||||
链 | |||||
II |
- 菊花图:存在一个度数为 的节点。
- 链:每个节点度数均不大于 。
- 计分方式 :成功遍历树,得满分;否则得 分。
- 计分方式 :成功遍历树的得分为 。