P3817 小A的糖果

文章描述了一个问题,小A有一个包含多个糖果盒,每个盒子里有不同的糖果数。目标是确定为了确保任何两个相邻盒子的糖果数之和不超过给定的x,小A至少需要吃掉多少颗糖。给出了输入输出样例以及C++代码实现解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

小 A 有 𝑛n 个糖果盒,第 𝑖i 个盒中有 𝑎𝑖ai​ 颗糖果。

小 A 每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中糖的个数之和都不大于 𝑥x,至少得吃掉几颗糖。

输入格式

输入的第一行是两个用空格隔开的整数,代表糖果盒的个数 𝑛n 和给定的参数 𝑥x。

第二行有 𝑛n 个用空格隔开的整数,第 𝑖i 个整数代表第 𝑖i 盒糖的糖果个数 𝑎𝑖ai​。

输出格式

输出一行一个整数,代表最少要吃掉的糖果的数量。

输入输出样例

输入 #1复制

3 3
2 2 2

输出 #1复制

1

输入 #2复制

6 1
1 6 1 2 0 4

输出 #2复制

11

输入 #3复制

5 9
3 1 4 1 5

输出 #3复制

0

说明/提示

样例输入输出 1 解释

吃掉第 2 盒中的一个糖果即可。


样例输入输出 2 解释

第 2 盒糖吃掉 66 颗,第 4 盒吃掉 22 颗,第 6 盒吃掉 33 颗。


数据规模与约定
  • 对于 30%30% 的数据,保证 𝑛≤20n≤20,𝑎𝑖,𝑥≤100ai​,x≤100。
  • 对于 70%70% 的数据,保证 𝑛≤103n≤103,𝑎𝑖,𝑥≤105ai​,x≤105。
  • 对于 100%100% 的数据,保证 2≤𝑛≤1052≤n≤105,0≤𝑎𝑖,𝑥≤1090≤ai​,x≤109。

代码 

#include<bits/stdc++.h>

using namespace std;

long long ans=0;
long long a[100010];

int main(){
	long long n,x;
	scanf("%ld%ld",&n,&x);
	for(long i=0;i<n;i++) cin>>a[i];
	for(long i=0;i<n-1;i++){
		if(a[i]+a[i+1]>x){
			ans+=a[i+1]+a[i]-x;
            if(a[i+1]+a[i]-x>a[i+1]) a[i+1]=0;
            else a[i+1]=x-a[i];
		}
	}
	printf("%lld",ans);
	return 0;
}

### p3275 糖果 Java 项目 示例 代码 针对 `p3275` 糖果问题,可以设计一个基于广度优先搜索 (BFS) 的解决方案来寻找从起点到终点的最短路径并最大化收集的糖果数量。以下是具体实现: #### 主要思路 为了确保能够找到最优解,在遍历过程中不仅记录访问过的节点还应统计当前路径上累积获得的糖果数。 #### BFS 实现细节 - 使用队列存储待处理的位置及其对应的已获取糖果数目。 - 对每一个新加入队列的位置更新其邻居状态,并传递累计糖果计数值给这些邻接点。 - 当首次抵达目标位置时即得到一条有效路径;继续探索直到确认这是具有最高得分的最佳路线为止。 下面是完整的 Java 源码示例: ```java import java.util.*; public class CandyGame { static final int[][] directions = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}}; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 输入地图大小 n*m 及起始坐标 start(x,y),终止坐标 end(a,b) String[] nm = scanner.nextLine().split(" "); int n = Integer.parseInt(nm[0]); int m = Integer.parseInt(nm[1]); String[] startPos = scanner.nextLine().split(","); int startX = Integer.parseInt(startPos[0]) - 1; int startY = Integer.parseInt(startPos[1]) - 1; String[] targetPos = scanner.nextLine().split(","); int targetX = Integer.parseInt(targetPos[0]) - 1; int targetY = Integer.parseInt(targetPos[1]) - 1; char[][] map = new char[n][]; for (int i = 0; i < n; ++i){ map[i] = scanner.next().toCharArray(); } System.out.println(maxCandies(map, startX, startY, targetX, targetY)); } private static int maxCandies(char[][] grid, int sr, int sc, int tr, int tc) { Queue<int[]> queue = new LinkedList<>(); boolean visited[][] = new boolean[grid.length][grid[0].length]; queue.offer(new int[]{sr, sc}); visited[sr][sc] = true; Map<String, Integer> pathSum = new HashMap<>(); pathSum.put(sr + "," + sc, 'S' == grid[sr][sc] ? 1 : 0); while (!queue.isEmpty()) { int size = queue.size(); for (int k = 0; k < size; ++k) { int[] cur = queue.poll(); if (cur[0] == tr && cur[1] == tc) { return pathSum.get(cur[0]+","+cur[1]); } for (var dir : directions) { int nr = cur[0] + dir[0], nc = cur[1] + dir[1]; if (nr >= 0 && nr < grid.length && nc >= 0 && nc < grid[0].length && !visited[nr][nc] && '.' != grid[nr][nc]) { visited[nr][nc] = true; queue.add(new int[]{nr, nc}); int newValue = pathSum.getOrDefault(nr +"," + nc , 0); int oldValue = pathSum.get(cur[0] + "," + cur[1]); pathSum.put(nr + "," + nc, Math.max(newValue, oldValue + ('S' == grid[nr][nc] ? 1 : 0))); } } } } return -1; } } ``` 该程序读取标准输入中的迷宫布局以及起点和终点的信息,然后利用广度优先搜索算法求解最佳路径上的最大糖果数量[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值