题解 P3817 【小A的糖果】

· · 题解

#include<bits/stdc++.h>
using namespace std;
long long n,x; 
long long a[1005*1005];
long long sum=0;//存储吃糖果的个数
int main() {
    ios::sync_with_stdio(false);
    //cin和cout没有scanf和printf效率高,why?
    //因为,cin与stdin'是保持同步的
    // 就是说他们可以混搭,文件指针不会乱成一锅粥
    //out与stdout同理,输出不会出现顺序错乱
    //怎么禁止这个特性呢?
    //你只需要---ios::sync_with_stdio(false);
    cin>>n>>x;
    for(int i=1; i<=n; i++)
        cin>>a[i];//输入数据
    for(int i=1; i<=n; i++) {
        if(a[i]>x) {
            //这个是一个处理
            //因为要求--a[i]+a[i-1]<=x,那么满足这个条件的先觉是,必须每一个盒子的糖果数都必须<=x吧
            //因为我的a[i]都>x,的话,凉凉,a[i]+a[i-1}铁定>x;
            sum+=a[i]-x;//至少让a[i]==x嘛,就吃掉多余的 
            a[i]=x;//上面说了撒,至少保证a[i]==x; 
        }
    }
    for(int i=2; i<=n; i++) {//因为a[i]+a[i-1]的缘故,所以i从2开始,其实从1开始也可以,a[0]=0,不影响 
        if(a[i]+a[i-1]>x) {//如果大于了x,就准备吃糖吧 
            sum+=a[i]+a[i-1]-x;//吃掉多余的 
            a[i]=x-a[i-1];//贪心--因为我要吃最少的糖满足条件,就必须保证a[i]+a[i-1]刚好等于x,就可以少吃糖 
        }
    }
    cout<<sum;//收工,输出答案 
    return 0;//养成一个好习惯 
}