2 条题解
-
1
在题解开始之前,先让我%%%%%一下@尚轩好大神,相比孙老板的dp,他的代码更加容易理解(
也更好码)
那么首先让我们来读一下题 有两只青蛙A,B,他们都要跳过n个石子。石子间的距离有长有短,有些甚至超过了青蛙们的弹跳能力,怎么办呢?他们有一个超级大宝贝
助跳器
这个助跳器非常强大,可以让青蛙的弹跳能力由m变为k。而根据题中数据保证,有了助跳器的青蛙可以一路跳到终点! 那么该怎么决定青蛙拿到弹跳器的顺序呢?
先看看题目的样例说明
青蛙 𝐴 先走到第二颗石头(位置 10),此时将助跳器传递给青蛙 𝐵;青蛙 𝐵 跳 到终点(位置 20)再将助跳器传递给 𝐴,𝐴 跳到终点。
注意:若 𝐴 直接跳到终点,则此时助跳器传递不到 𝐵(因为两青蛙此时的距离 大于 𝑞), 𝐵 无法抵达终点。
明显的,如果我们一开始先让a跳,是非常难以考虑的。代码的执行有先后,如果你不知道b在没有助跳器的情况下能跳到什么位置,那你也决定不了a要跳到哪个位置(a需要给b助跳器,条件是a与b距离小于q) 所以,我们要反其道而行之,先让b跳到他的极限 这个代码实现非常简单,如果下一块石头和他脚踩的距离小于m就跳过去,就不贴出来了; b跳完了,那么现在看看a 对于持有助跳器的a来说,他想跳到哪里就跳哪里,重要的是他需要给b助跳器,明显的,他所能跳到的最远距离是和b相差小于等于q的距离。我们把他跳过去,就让他把助跳器给过去。 此时拿有助跳器的b,操作上是可以等同a的,他也可以跳到任意位置,重要的是失去助跳器后的a能跳到哪个位置
那么讲到这里,其实大家应该也差不多懂了吧,下面是核心代码;
void bs() { while(y<n&&b[y+1]-b[y]<=m) y++; if(y==n)return ; while(x<n&&a[x+1]-b[y]<=q) x++; ans++; as(); }
最后%%%%一下葛雨墨大神,上能codding,下能文能理,在考试中取得nb的成绩。
信息
- ID
- 785
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 35
- 已通过
- 8
- 上传者