题意:x轴有w个点[1,2,3...w],长度为w-1的序列a,表示第i个点有a[i]个石头.
现在有一群青蛙要过河,已知青蛙的跳跃距离为[1..L],跳到的点其a[i]值必须要>0,并且每只青蛙到第i个点时,会使a[i]--.
1<=L<W<1e5.0<=a[i]<=1e4.问最多有多少只青蛙可以达到点w.
前L个石子的和为sum,那么显然答案最多为sum.
设b[i]为第i个位置的青蛙个数最多为多少.
能到第i个石子上的青蛙 显然只有从[i-L,i-1]这段区间.
贪心:从b[i-L]开始跳 直到b[i]==a[i]为止.
那么只要维护一个离当前位置为L的指针p
现在有一群青蛙要过河,已知青蛙的跳跃距离为[1..L],跳到的点其a[i]值必须要>0,并且每只青蛙到第i个点时,会使a[i]--.
1<=L<W<1e5.0<=a[i]<=1e4.问最多有多少只青蛙可以达到点w.
前L个石子的和为sum,那么显然答案最多为sum.
设b[i]为第i个位置的青蛙个数最多为多少.
能到第i个石子上的青蛙 显然只有从[i-L,i-1]这段区间.
贪心:从b[i-L]开始跳 直到b[i]==a[i]为止.
那么只要维护一个离当前位置为L的指针p
若b[p]还有剩下,这可以舍弃这些,因为[p+1,i]这段的b[i]值已经最大.
#include <bits/stdc++.h> using namespace std; const int N=2e5+5; int w,L,a[N],b[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>w>>L; for(int i=1;i<w;i++) { cin>>a[i]; if(i<=L) b[i]=a[i]; } a[w]=2e9; int p=1; for(int i=L+1;i<=w;i++) { while(i-p>L) p++; while(p<i&&b[i]+b[p]<=a[i]) { b[i]+=b[p]; p++; } if(p<i&&b[i]!=a[i]) { int ned=a[i]-b[i]; b[p]-=ned; b[i]=a[i]; } //cout<<b[i]<<'\n'; } cout<<b[w]<<'\n'; return 0; }