1 条题解
-
0
自动搬运
来自洛谷,原作者为

Y_ATM_K
ด้้้้้็้้้็็็็็้้้้้็็็็็้้้้้้็็็็็้้้้้็็็็็้้้้้้็็็็็้้้้้็็็็็้้้้้้็็็็็้้้้้็็็็็้้้้้้็็AFO!搬运于
2025-08-24 22:42:21,当前版本为作者最后更新于2022-11-16 22:16:26,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
分析
容易发现,青蛙从左跳到右和从右到左没有区别,因此相当于青蛙从左到右跳 次。
通过几个样例,可以发现这样一个规律:对于一个跳跃能力 ,青蛙能跳过河 次,当且仅当对于每个长度为 的区间,这个区间内 的和都大于等于 。
证明一下。
先证明必要性。
假设青蛙能跳过 次,对于一个长度为 的区间,因为青蛙无论怎么跳,都必须经过这个区间,所以这个区间所有 的和必定大于等于 。
再证明充分性。
我们让 只青蛙一起跳。对于青蛙跳一次能到达的区间 ,这里显然可以跳 只青蛙。那么考虑让 位置上的青蛙跳到 位置上。
若 ,则 的青蛙全部能跳到 上;
若 ,因为 ,
即 ,所以区间 能容纳 之青蛙,可以让多出来的几只跳到 中。
以此类推,可以让 只青蛙全部跳过河。
于是可以用双指针扫一遍,得到满足条件的最小的 即可。
时间复杂度 .
代码
#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; }
- 1
信息
- ID
- 7953
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者