头像

欢迎来到我的博客

分享题解与总结

P3817 小A的糖果

image

思路:
当仅:左+右>x时,考虑如下情况
关键考虑:两堆糖果,是选择吃左边这一堆,还是选择吃右边这一堆,吃多少?

case1:两边都超过x:则左边先吃到刚好为x,右边吃空
case2:左边超过x,右边没超过:则左边先吃到刚好为x,右边吃空
case3:左边没超过,右边超过:右边吃到x-左边的值
case4:两边都没超过,但总和大于x:右边吃到x-左边的值

局部最优,比如轮到这两个时,
当前剩余糖果数目是:l=7,r=6,x=4

则必须吃掉l+r-x=9颗糖才合格,则下面考虑这9颗糖如何分配:
吃掉左边3颗,吃掉右边6颗,是局部最优(右边吃到力所能及的最少,最有利于后面少吃)

#include<bits/stdc++.h>
#define MAXN 100005
using ll=long long;
using namespace std;
ll n,x,a[MAXN],l,r,ans; 

int main()
{
	cin>>n>>x;
	for(ll i=1;i<=n;++i){
		scanf("%lld",&a[i]);
	}
	for(l=1;l<n;++l){
		r=l+1;
		if(a[l]+a[r]>x){
			ans+=a[l]+a[r]-x;
			if(a[l]>x){//左边超过+右边超/没超 
				a[l]=x,a[r]=0;
			}
			else if(a[l]<=x&&a[r]>x){//左边没超+右边超过 
				a[r]=x-a[l];
			}
			else{//两边都没超过 	
				a[r]=x-a[l];
			}
		}
	}
	cout<<ans;
	return 0;
}
posted @ 2026-02-11 11:38  king_steph1209  阅读(15)  评论(0)    收藏  举报