洛谷P3817题解:贪心算法解决糖果分配问题

一、问题分析

题目描述了一个有n盒糖果的序列,每盒有ai颗糖果。要求相邻两盒糖果的总和不能超过x,需要通过吃掉最少数量的糖果来满足这个条件。

二、解题思路

  1. 贪心算法‌:每次处理相邻两盒糖果时,优先处理后面的盒子,因为这样可以影响下一对相邻盒子的计算

  2. ‌局部最优‌:对于每对相邻盒子,计算超出x的部分,优先从后一盒吃掉糖果

  3. ‌全局最优‌:通过局部最优的选择,最终达到全局最优解(吃掉最少糖果)

三、关键算法详解

1. 输入处理
复制代码
int n, x;
cin >> n >> x;vector<int> a(n);for (int i = 0; i < n; ++i) {
    cin >> a[i];
}

读取糖果盒数量和限制值x,然后读取每盒糖果的数量。

2. 贪心处理相邻盒子
复制代码
for (int i = 1; i < n; ++i) {    if (a[i-1] + a[i] > x) {        int need_to_eat = a[i-1] + a[i] - x;        int can_eat = min(need_to_eat, a[i]);
        a[i] -= can_eat;        if (can_eat < need_to_eat) {
            a[i-1] -= (need_to_eat - can_eat);
        }
        total_eaten += need_to_eat;
    }
}

核心贪心逻辑:对于每对相邻盒子,计算超出部分,优先从后一盒吃掉糖果,如果还不够再吃前一盒的。

四、完整代码

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n, x;
    cin >> n >> x;
    
    vector<int> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    
    long long total_eaten = 0;
    
    // 从左到右处理相邻盒子
    for (int i = 1; i < n; ++i) {
        if (a[i-1] + a[i] > x) {
            // 计算需要吃掉的糖果数
            int need_to_eat = a[i-1] + a[i] - x;
            // 优先吃当前盒子的糖果,因为可以影响下一对
            int can_eat = min(need_to_eat, a[i]);
            a[i] -= can_eat;
            // 如果还不够,再吃前一个盒子的
            if (can_eat < need_to_eat) {
                a[i-1] -= (need_to_eat - can_eat);
            }
            total_eaten += need_to_eat;
        }
    }
    
    cout << total_eaten << endl;
    return 0;
}

来源:洛谷P3817题解:贪心算法解决糖果分配问题

相关推荐
随意起个昵称7 小时前
区间dp-基础题目1(石子合并)
算法·动态规划
吞下星星的少年·-·7 小时前
线段树模板
算法
wunaiqiezixin7 小时前
如何在C++中创建和管理线程
c++
段一凡-华北理工大学7 小时前
2026 高炉炼铁智能化技术全景与演进路径~系列文章11:演进路径与行业未来
大数据·网络·人工智能·算法·工业智能体·高炉炼铁智能化
雪度娃娃8 小时前
转向现代C++——在意为改写的函数添加 override
开发语言·c++
王老师青少年编程8 小时前
csp信奥赛C++高频考点专项训练之前缀和&差分 --【一维差分】:[NOIP 2018 提高组] 铺设道路
c++·前缀和·差分·csp·高频考点·信奥赛·铺设道路
叶小鸡8 小时前
小鸡玩算法-力扣HOT100-多维动态规划
算法·leetcode·动态规划
星马梦缘8 小时前
aaaaa
数据结构·c++·算法
菜菜的顾清寒9 小时前
力扣HOT100(42)链表-随机链表的复制
算法·leetcode·链表
lqqjuly9 小时前
模型剪枝与稀疏化:理论、算法与可运行实现
人工智能·算法·剪枝