P3817 小A的糖果

小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;
} 

posted @   LTphy  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示