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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值