#P16175. [Ncpc2023]Berry Battle 2浆果大战 2
[Ncpc2023]Berry Battle 2浆果大战 2
题目描述
Erik 经常和爷爷一起去森林里摘蓝莓。爷爷总是摘得最多,虽然这并不是一场正式比赛,但 Erik 已经受够了。
Erik 发现,爷爷摘蓝莓时会使用一种非常简单的贪心策略。于是 Erik 想利用这一点,终于做到摘到不少于爷爷数量的蓝莓。
蓝莓灌木可以表示为一个长度为 的字符串
其中每个字符为 . 或 b:
- 若 ,表示位置 有一颗蓝莓;
- 若 ,表示位置 没有蓝莓。
初始时恰好有 颗蓝莓,并且它们的位置是均匀随机生成的。
摘蓝莓按回合进行。每一步,一个人可以选择一个位置 ,满足
然后摘走位置 上的所有蓝莓。
爷爷先手,然后 Erik 行动,然后爷爷行动,如此交替进行。
爷爷每次都会贪心地选择一个能摘到最多蓝莓的位置。如果有多个位置都能摘到同样多的最多蓝莓,则爷爷会在这些位置中随机选择一个。
你会得到初始字符串 。你的任务是编写一个程序,在交互过程中决定 Erik 每一步的选择,使得最终 Erik 摘到的蓝莓数不少于爷爷。
交互格式
本题为交互题。
交互器首先向你的程序输入两行:
第一行包含一个整数 ,表示字符串长度。除样例外,正式测试中始终有:
第二行包含一个长度为 的字符串 ,其中恰好有 个字符为 b。
之后开始交互。
当轮到爷爷行动时,你的程序需要读取一个整数 ,表示爷爷选择了区间
并摘走其中的所有蓝莓。
当轮到 Erik 行动时,你的程序需要输出一个整数 ,表示 Erik 选择区间
并摘走其中的所有蓝莓。
每次输出后,必须刷新输出缓冲区。
例如:
- C++ 可以使用
endl或cout.flush(); - C 可以使用
fflush(stdout); - Python 可以使用
print(..., flush=True)。
如果轮到 Erik 行动时已经没有蓝莓了,你的程序应当直接结束,不再输出任何内容。
如果轮到爷爷行动时已经没有蓝莓了,交互器也不会再给出新的爷爷操作,此时你的程序也应结束。
最终如果 Erik 摘到的蓝莓数不少于爷爷,则该测试点通过。
爷爷的策略
每一轮爷爷都会选择当前能摘到蓝莓数最多的长度为 的连续区间。
若这样的区间有多个,爷爷会随机选择其中一个。
在本 Hydro 配置中,爷爷的随机选择由测试点输入中的隐藏随机种子控制。该种子不会传给选手程序,因此选手程序只能根据交互器实际给出的爷爷操作进行应对。
测试点说明
正式数据共有 个测试点。
保证存在一种策略,能够以很高概率通过所有测试点。
样例交互
下面的样例中,< 表示交互器输出给选手程序的内容,> 表示选手程序输出给交互器的内容。
< 20
< .bbb.b.bb...b.b...bb
< 2
> 6
< 13
> 17
在这个样例中,Erik 和爷爷最终各摘到 颗蓝莓,因此 Erik 达成目标。
游戏开始时,单次最多可以摘到 颗蓝莓。能摘到 颗蓝莓的位置有 ,爷爷随机选择了 。随后 Erik 选择 ,也摘到 颗蓝莓。最后两轮中,爷爷和 Erik 各摘到 颗蓝莓。