这道题有一个细节应注意:只需判断任意两个相邻的盒子,这大大降低了题目的复杂度。
用数组存数据没啥好说的,注意开long long,因为元素最大可达10^9
分析
-
若两个相邻盒子的糖的个数之和大于x,则应吃掉后一个盒子的糖来实现糖数不大于x,
原因:后一个盒子的糖可分为两部分,①与上个盒子组合②与下一个盒子组合,吃掉这个盒子的糖有利于下一组相邻盒子的条件的达成。
-
若第一个盒子的糖大于x,应先吃第一个盒子的糖来满足条件
步骤
-
输入
-
直接模拟,按照上面分析的思路
-
用s计数,输出完事。
ac代码如下:
#include<iostream>
using namespace std;
long long a[100010];
int main() {
long long n, x, s = 0;
cin >> n >> x;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = 1; i <= n-1; i++)
{
if (a[1] > x)
{
s += a[1] - x;
a[1] = x;
}
if (a[i]+a[i+1]>x)
{
s += a[i] + a[i + 1] - x;
a[i + 1] -= a[i] + a[i + 1] - x;
}
}
cout << s;
return 0;
}