P3817 小A的糖果题解

题目传递门
首先我们可以把这几个糖果盒分对来讨论; 先从第一个糖果盒和第二个开始; 如果一个糖果盒的数量就超限了,我们当然至少要把它吃到剩下(x)个; 然后如果单论两个都没有超限,但加起来超限了怎么办呢? 首先第一个糖果盒是只有一个分组的(和第二个), 而第二个糖果盒却有两个分组(和第(1)个/和第(3)个); 所以如果我们吃掉第一个里的,只会减少一个分组的量,而如果吃掉第二个里的,可以减少(2)个分组的量。所以我们要尽量吃掉第二个里的糖果。 处理好第一个分组后,来看第二个,因为第一个分组已经被处理好了,所以可以无视它,然后问题又变成了前一个问题。 以此类推就好了。

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
//题解:都要吃最后的,这样才最少。
const int N = 100010;
int a[N];

LL ans = 0; //因为是累加和,注意小心是long long
int n, x;   //糖果盒的个数 n,给定的参数 x(不能超过x)

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 + 1] + a[i] - x; //吃掉的糖数量
            a[i + 1] = x - a[i];        //a[i+1]剩余的数量。这个差,要在后面那个盒子里出,这样才最有效。
        }
    }
    cout << ans << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/littlehb/p/15034953.html