题目
小A有n个糖果盒,第i个盒中有颗糖果。
小A每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中糖的个数之和都不大于x,至少得吃掉几颗糖。
输入输出格式
输入格式
输入的第一行是两个用空格隔开的整数,代表糖果盒的个数n和给定的参数x。
第二行有个用空格隔开的整数,第i个整数代表第i盒糖的糖果个数。
输出格式
输出一行一个整数,代表最少要吃掉的糖果的数量。
输入输出样例
输入样例
3 3
2 2 2
输出样例
1
解析
这个题目首先我们可以把这几个糖果盒分对来讨论; 先从第一个糖果盒和第二个开始; 如果一个糖果盒的数量就超限了,我们当然至少要把它吃到剩下x个; 然后如果单论两个都没有超限,但加起来超限了怎么办呢? 首先第一个糖果盒是只有一个分组的(和第二个), 而第二个糖果盒却有两个分组(和第1个/和第3个); 所以如果我们吃掉第一个里的,只会减少一个分组的量,而如果吃掉第二个里的,可以减少2个分组的量。所以我们要尽量吃掉第二个里的糖果。 处理好第一个分组后,来看第二个,因为第一个分组已经被处理好了,所以可以无视它,然后问题又变成了前一个问题。 以此类推问题得以解决。
#include<iostream>
using namespace std;
long long n,x,a[100005],sum;
int main(){cin>>n>>x;cin>>a[1];if(a[1]>x){sum+=a[1]-x;a[1]=x;}for(int i=2;i<=n;i++){cin>>a[i];if(a[i]+a[i-1]>x){sum+=a[i]+a[i-1]-x;a[i]=x-a[i-1];}}cout<<sum;return 0;
}