P8775 [蓝桥杯 2022 省 A] 青蛙过河
题面
分析
容易发现,青蛙从左跳到右和从右到左没有区别,因此相当于青蛙从左到右跳
通过几个样例,可以发现这样一个规律:对于一个跳跃能力
证明一下。
先证明必要性。
假设青蛙能跳过
再证明充分性。
我们让
若
若
即
以此类推,可以让
于是可以用双指针扫一遍,得到满足条件的最小的
时间复杂度
代码
#include <bits/stdc++.h>
#define N 100005
using namespace std;
int n,T,h[N],ans;
int main() {
scanf("%d%d",&n,&T);T<<=1;
for(int i=1;i<n;++i) scanf("%d",&h[i]);
for(int i=1,j=0,sum=0;i<n;++i) {
while(j<n&&sum<T) sum+=h[++j];
ans=max(ans,j-i+1);
sum-=h[i];
}
printf("%d\n",ans);
return 0;
}