P3817 小A的糖果

luogu 传送门

挺好想的贪心(蒟蒻一下就想到啦)。
我们从前往后处理时,尽量吃后面的糖,因为后面的糖会对后面产生影响,而前面的就不会影响了。
不过要开long long ,为此我wa了两个点。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int n,x;
LL a[100009],ans;
int main()
{
    scanf("%d%d",&n,&x);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)
    {
        int p;
        if(a[i]>x) ans+=a[i]-x,a[i]=x;
        if(a[i]+a[i-1]>x)
        {
            p=a[i]+a[i-1]-x;
            if(a[i]>=p) a[i]-=p;
            else p-=a[i],a[i]=0,a[i-1]-=p;
            ans+=p;
        }
        if(a[i]+a[i+1]>x)
        {
            p=a[i]+a[i+1]-x;
            if(a[i+1]>=p) a[i+1]-=p;
            else p-=a[i+1],a[i+1]=0,a[i]-=p;
            ans+=p;
        }//注意两个if的顺序,先处理i和i-1,再处理i和i+1,因为前者会减小对后者的压力
    }
    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、付费专栏及课程。

余额充值