P3817 小A的糖果

思路:
当仅:左+右>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;
}

浙公网安备 33010602011771号