小A的糖果
题目描述
小 A 有 $n$ 个糖果盒,第 $i$ 个盒中有 $a_i$ 颗糖果。
小 A 每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中糖的个数之和都不大于 $x$,至少得吃掉几颗糖。
输入格式
输入的第一行是两个用空格隔开的整数,代表糖果盒的个数 $n$ 和给定的参数 $x$。
第二行有 $n$ 个用空格隔开的整数,第 $i$ 个整数代表第 $i$ 盒糖的糖果个数 $a_i$。
输出格式
输出一行一个整数,代表最少要吃掉的糖果的数量。
样例 #1
样例输入 #1
3 3
2 2 2
样例输出 #1
1
样例 #2
样例输入 #2
6 1
1 6 1 2 0 4
样例输出 #2
11
样例 #3
样例输入 #3
5 9
3 1 4 1 5
样例输出 #3
0
提示
样例输入输出 1 解释
吃掉第 2 盒中的一个糖果即可。
样例输入输出 2 解释
第 2 盒糖吃掉 $6$ 颗,第 4 盒吃掉 $2$ 颗,第 6 盒吃掉 $3$ 颗。
数据规模与约定
- 对于 $30%$ 的数据,保证 $n \leq 20$,$a_i, x \leq 100$。
- 对于 $70%$ 的数据,保证 $n \leq 10^3$,$a_i, x \leq 10^5$。
- 对于 $100%$ 的数据,保证 $2 \leq n \leq 10^5$,$0 \leq a_i, x \leq 10^9$。
算法1
(贪心)
贪心策略:
如果相邻两个盒子糖果的数量大于x,就吃右边盒子的糖,否则不进行任何操作
为什么吃右边盒子的糖果呢?
如果我们吃掉左边盒子里的糖,就只会减少这一轮相邻两个盒子糖果的数量;
如果我们吃掉右边盒子里的糖,那么这次操作还可以减少下一轮相邻两个盒子糖果的数量,
因此符合贪心的逻辑
C++ 代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n,x;
int a[N];
int ans;
signed main(){
scanf("%lld%lld",&n,&x);
for(int i = 1; i <= n; i++){
scanf("%lld",&a[i]);
}
for(int i = 1; i <= n; i++){
if(a[i] + a[i-1] > x) {
ans += a[i] - x + a[i - 1];
// cout << a[i] - x + a[i - 1] << endl;
a[i] = x - a[i - 1];
// cout << a[i] << endl;
}
}
printf("%lld",ans);
return 0;
}
标签:吃掉,盒子,int,样例,leq,P3817,糖果 From: https://www.cnblogs.com/ltphy-/p/18425751