CF207B Military Trainings题解

CF207B Military Trainings 题解

题目大意

题目传送门cf 原题

n n n 辆坦克,从 1 1 1 n n n 编号,这些坦克要进行 n n n 次传递信息,方式如下。

1 1 1 号坦克可以把信息传递给后面的一辆坦克,再传给下一辆坦克。以此类推,直到传递到 n n n 号坦克。

每个坦克有一个传递半径,初始时 i i i 号坦克传递半径为 a i a_i ai

i i i 号坦克能给 j j j 号坦克传递信息当且仅当 i < j i < j i<j i ≥ j − w i \ge j - w ijw,其中 w w w 表示 j j j 号坦克的传递半径。

n n n 号坦克接收到信息之后,它会移动到这列坦克的开头,并用同样的方式传递信息给最移动后最末尾的坦克(也就是原先的 n − 1 n-1 n1 号坦克)。在信息传递到末尾的坦克后,那辆坦克移动到这列坦克的开头,并发送下一个信息到队列 a 末尾。依此类推,直到传递完 n n n 次信息。

思路

首先可以先不考虑移动的情况,只考虑不移动的情况,最后加上移动。

Step1:反向思考

如果正向考虑(从 1 1 1 号坦克传递到 n n n 号坦克),从 i i i 号坦克能传递到的坦克编号不连续,不容易处理。

那就需要反向思考,考虑哪个坦克能传递到 i i i 号坦克,这样坦克编号就会变连续,容易处理。

进一步的,可以把原题看成从 n n n 号坦克传递信息到 1 1 1 号坦克,条件从 i i i 号坦克传递给 j j j 号坦克变成 j j j 号坦克传递给 i i i 号坦克。

Step2:贪心选择

那对于 i i i 号坦克,他能传递给的坦克编号在 [ i − w , i − 1 ] [i-w,i-1] [iw,i1] 区间内( w w w 表示 i i i 号坦克传递半径)。

根据贪心的思路,每次传递信息一定要传递给下一次能到达最远的点。形式化来说,就是选一个点 j ∈ [ i − w , i − 1 ] j\in[i-w,i-1] j[iw,i1],使得 j − v j-v jv 最小( v v v 表示 j j j 号坦克传递半径)。

Step3:获取答案

设从 i i i 号坦克要到的坦克编号为 n x i nx_i nxi,那么每次查询只需要设一个变量 n o w now now,表示当前的坦克编号。

那只需要重复循环,每次让 n o w now now 变成 n x n o w nx_{now} nx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值