牛客月赛4-(相邻的糖果)-(思维)

H

题意:
就是给你n个盒子,里面有糖果,现在问你最少要吃多少糖果,才能让任意连续m个盒子的糖果不超过k。

思考:
刚开始我感觉还是啥dp难题…,其实刚开始先把前m个看看,最少要吃多少,然后往右边走,如果能不吃就不吃,如果需要吃就吃。
因为什么的,因为前m个已经满足条件了,然后往后走一格,会加一些数,同时会减去最开始的数,如果加的这个数为0,肯定也是满足的,所以看看最少能吃多少就行了,不要想的太复杂。贪心的策略是尽量吃右边的。

代码:

int T,n,m,k;
int va[N];

signed main()
{
	IOS;
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++) cin>>va[i];
	int ans = 0,anw = 0;
	for(int i=1;i<=m;i++)
	{
		int can = k-ans;
		ans += min(va[i],can); //看看这里面能剩多少
		anw += va[i]-min(va[i],can);
		va[i] = min(va[i],can); //剩下的
	}
	for(int i=m+1;i<=n;i++)
	{
		ans -= va[i-m]; //出去的
		int can = k-ans;
		ans += min(va[i],can);
		anw += va[i]-min(va[i],can);
		va[i] = min(va[i],can);
	}
	cout<<anw;
	return 0;
}

总结:
多多思考,别想复杂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值