2025/12/01 分享
不知道为什么最近身体状态才恢复过来,可能要多加锻炼了。
这是一个捡金币的游戏。
- 有一根数轴,玩家一开始在位置 \(0\) ,每秒可以选择往前走一步或者留在原地。
- 有 \(N\) 个金币,第 \(i\) 个会在 \(t_i\) 时刻落在 \(x_i\) 的位置,并在下一刻时刻消失。
询问玩家最多能捡到多少枚金币。
考虑我们没法回头捡,那么金币可以按照出现的位置排序。如果一个位置有多个金币,我们只能先捡先出现的。如果一个位置多个金币同时落下来,则顺序无所谓。按照这个偏序排序金币数组,从中删去 \(t_i - x_i < 0\) 的,这些金币哪怕我们疯狂往前走也捡不到。然后称呼 \(t_i - x_i\) 为等待时间。
考虑维护一个全局的等待时间 \(cost\) ,走到一个位置后每等待一秒,\(cost\) 就加 \(1\) ,如果下一秒继续往后走,\(cost\) 不变。显然随着时间的推移 \(cost\) 一定是非降的这意味着我们能捡到的金币,一定满足 \(\forall i > j, t_i - x_i \geq t_j - x_j\) 。
那么答案就是以上述偏序排序的且满足 \(t_i - x_i \geq 0\) 的数组上,对 \(t_i - x_i\) 求最长非降子序列。这个长度就是答案。具体实现可以通过离散化 + 树状数组查询来加速最长非降子序列的 DP 。
——永远是挑战而不是练习,下次一定更好。
浙公网安备 33010602011771号