题:《青蛙过河》
题意:小青蛙过河问题是这样的:小青蛙可以以跳跃能力
y
y
y过河,其跳跃距离不超过
y
y
y,河里面有若干石头,每一次跳上去之后石头高度减1,如果是0,则该位置不能被跳。但是由1变0的跳跃是允许的。问跳跃能力至少是多少。
在石头个数为
n
n
n(1e5)基础上,想到二分是容易的,但是如何判断在跳跃能力为
y
y
y的时候,青蛙可以过河?可以这样来看,
∀
j
<
i
\forall j<i
∀j<i,青蛙在位置
j
j
j经过若干次一定会跳进区间
[
i
,
i
+
y
)
[i,i+y)
[i,i+y)。否则就是从
i
i
i的左边(不含
i
i
i)跳到了
i
+
y
i+y
i+y的右边(含
i
+
y
i+y
i+y)。只需要让任意区间
[
i
,
i
+
y
]
[i,i+y]
[i,i+y]的石头高度之和为
2
∗
x
2*x
2∗x
所以只要用以下判断即可:
for(int i=1;i<=n-y;i++)
{
int l=i;
int r=l+y-1;//[l,r]区间长度为y
if(qianzhui[r]-qianzhui[l-1]<2*x)
return 0;
}
return 1;