#P14626. [IATI2021 day2]Rabbit
[IATI2021 day2]Rabbit
题目类型说明
这是一道构造题 / 评分题。
你需要输出一个要依次检查的格子序列,保证无论兔子的初始位置在哪里,都一定能在有限时间内找到它;同时你输出的序列越短,得分越高。
题目描述
疯帽子丢失了他最喜欢的兔子(当然就是白兔),兔子藏在一排共 N 个格子中的某一个位置上。
这些格子从 1 到 N 编号。
初始时,兔子位于某个未知格子中。此后每一秒,搜寻过程都按如下顺序进行:
- 疯帽子先选择一个格子进行检查。若兔子就在该格子中,则搜索立即结束。
- 否则,兔子会进行一次动作:
- 可以留在原地;
- 也可以跳到相邻格子,即向左一格或向右一格。
注意:兔子即使跳进刚才被检查的格子,也不会因此被视为找到;只有在“检查”那一刻兔子正好在那里,才算找到。
兔子的行动由它当前的情绪决定,且在给定情绪下是确定性的:
1. 害怕(Scared)
若兔子处于“害怕”状态,它会朝着远离本次被检查格子的方向移动。
- 如果已经无法继续远离(即位于
1或N),则留在原地。
2. 好奇(Curious)
若兔子处于“好奇”状态,它会朝着靠近本次被检查格子的方向移动。
- 在这种状态下,总是可以找到一个更靠近被检查格子的移动方式。
兔子的动作只取决于最近一次被检查的格子,不会记忆更久之前的检查历史。
疯帽子非常了解这只兔子的情绪变化规律:
- 兔子的情绪会不断循环,模式为:连续
S秒处于“害怕”状态,接着连续C秒处于“好奇”状态,然后再次重复。
例如,当 S = 2, C = 1 时,情绪序列为:
[害怕, 害怕, 好奇, 害怕, 害怕, 好奇, ...]
请你编写程序 rabbit.cpp,输出一个检查序列,使得无论兔子初始在哪个格子,都能保证最终被找到。
输入格式
输入一行三个整数 N, S, C,表示格子数,以及兔子的情绪规律。
输出格式
第一行输出一个整数 K,表示你的检查序列长度,即总共检查 K 秒。
第二行输出 K 个整数,每个都在区间 [1, N] 内,表示第 1..K 秒依次检查的格子编号。
允许序列中出现重复格子。
评分方式
设你输出的检查序列长度为 K。
- 如果你检查了非法格子(即不在
[1, N]范围内),或者你的序列不能保证一定找到兔子,则该测试点得0分,并判为Wrong Answer。 - 否则,若该测试原始分值为
R,你将获得pR分,其中:
当 K > 2N 时:
当 K <= T 时:
否则:
其中
也就是说,方案越短,得分越高。
数据范围
2 <= N <= 10^40 <= S, C <= 50
测试信息
- 8% 的测试满足
S = 0, C = 1 - 12% 的测试满足
S = 1, C = 0 - 8% 的测试满足
S = 1, C = 1
样例 #1
输入 #1
12 2 1
输出 #1
14
2 5 3 2 6 1 2 11 12 12 8 10 12 6
说明
可以验证:无论兔子起始在哪个格子,上述检查序列都一定能找到它。
例如,若兔子一开始在格子 8,则过程如下:
| 秒数 | 检查格子 | 兔子当前情绪(移动前) | 兔子移动 |
|---|---|---|---|
| 1 | 2 | 害怕 | 8 -> 9 |
| 2 | 5 | 9 -> 10 |
|
| 3 | 好奇 | 10 -> 9 |
|
| 4 | 2 | 害怕 | 10 -> 11 |
| 5 | 6 | 11 -> 12 |
|
| 6 | 1 | 好奇 | 12 -> 11 |
| 7 | 2 | 害怕 | 11 -> 12 |
| 8 | 11 | 12 -> 12 |
|
| 9 | 12 | 好奇 | 找到 |
对于这个样例:
K = 14T = 12
因此 K > T,该方案只能获得部分分: