CF 956D. Single-use Stones 思维

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

若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;
}


猜你喜欢

转载自blog.csdn.net/noone0/article/details/80198790