题目描述
小 A 有 n个糖果盒,第 ii 个盒中有 ai颗糖果。
小 A 每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中糖的个数之和都不大于 x,至少得吃掉几颗糖。
输入格式
输入的第一行是两个用空格隔开的整数,代表糖果盒的个数 n 和给定的参数 x。
第二行有 nn 个用空格隔开的整数,第 ii 个整数代表第 ii 盒糖的糖果个数 ai 。
输出格式
输出一行一个整数,代表最少要吃掉的糖果的数量。
思路:
贪心,从第二个开始遍历,每次判断当前盒子和上一个盒子的糖果数是否超出要求,若超出,则优先吃掉后面的糖果,如果还没有达到要求,则吃掉上一个盒子的糖果。
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
#define ll long long
int a[100010];
int main()
{
int n,x;
scanf("%d%d",&n,&x);
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
}
ll ans = 0;
for(int i = 2; i <= n; i++)
{
if(a[i] + a[i-1] > x)
{
ans += (a[i] + a[i-1] - x);
if(a[i] > a[i] + a[i-1] - x)
{
a[i] -= (a[i] + a[i-1] - x);
}
else
{
a[i] = 0;
a[i-1] = a[i-1] - (x - a[i]);
}
}
}
printf("%lld\n",ans);
}