#P14626. [IATI2021 day2]Rabbit

[IATI2021 day2]Rabbit

题目类型说明

这是一道构造题 / 评分题

你需要输出一个要依次检查的格子序列,保证无论兔子的初始位置在哪里,都一定能在有限时间内找到它;同时你输出的序列越短,得分越高。


题目描述

疯帽子丢失了他最喜欢的兔子(当然就是白兔),兔子藏在一排共 N 个格子中的某一个位置上。

这些格子从 1N 编号。

初始时,兔子位于某个未知格子中。此后每一秒,搜寻过程都按如下顺序进行:

  1. 疯帽子先选择一个格子进行检查。若兔子就在该格子中,则搜索立即结束。
  2. 否则,兔子会进行一次动作:
    • 可以留在原地;
    • 也可以跳到相邻格子,即向左一格或向右一格。

注意:兔子即使跳进刚才被检查的格子,也不会因此被视为找到;只有在“检查”那一刻兔子正好在那里,才算找到。

兔子的行动由它当前的情绪决定,且在给定情绪下是确定性的:

1. 害怕(Scared)

若兔子处于“害怕”状态,它会朝着远离本次被检查格子的方向移动。

  • 如果已经无法继续远离(即位于 1N),则留在原地。

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 时:

p=0p = 0

K <= T 时:

p=1p = 1

否则:

p=0.3(TK)2p = 0.3\left(\frac{T}{K}\right)^2

其中

T=N(S+C)S+2max(S,C)+3max(S,C)T = \frac{N(S+C)}{S + 2\max(S,C)} + 3\max(S,C)

也就是说,方案越短,得分越高。


数据范围

  • 2 <= N <= 10^4
  • 0 <= 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 = 14
  • T = 12

因此 K > T,该方案只能获得部分分:

$$p \approx 0.3\left(\frac{12}{14}\right)^2 \approx 0.22$$