思路:
一开始的思路就是相邻的两个数,在需要拿出糖果的情况下,尽量从后面拿,这样可以保证下一次需要拿出的糖果最小(在后面那份糖果被拿走的情况下才拿前面的那份
我一开始没有将每次的和存下来而是直接在里面计算ans,这样导致后面所计算的是前面的差之和,而不是当次的差(这里的差都指相邻两个数相加与x的差
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
long long n,a[111111];
long long x,ans,anss;
int main()
{
cin>>n>>x;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<n;i++)
{
if(a[i]+a[i+1]>x)
{
ans+=a[i]+a[i+1]-x;
anss=a[i]+a[i+1]-x;
if(a[i+1]<anss)
{
a[i+1]=0;
a[i]=a[i]-anss+a[i+1];
}
else a[i+1]-=anss;
//cout<<"i="<<i<<"a[i+1]="<<a[i+1]<<"ans="<<ans<<endl;
}
}
cout<<ans<<endl;
return 0;
}