题意: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;
}