当前位置: 首页 > news >正文

【洛谷贪心算法题】P1094纪念品分组

该题运用贪心算法,核心思想是在每次分组时,尽可能让价格较小和较大的纪念品组合在一起,以达到最少分组的目的。
在这里插入图片描述

【算法思路】

  1. 输入处理:首先读取纪念品的数量n和价格上限w,然后依次读取每件纪念品的价格,并将其存储在容器vector中

  2. 排序:使用 sort 函数对纪念品的价格进行从小到大的排序。排序的目的是方便后续使用双指针法,能快速找到价格最小和最大的纪念品。

  3. 双指针初始化:初始化两个指针 left 和 right,分别指向价格最小和最大的纪念品。同时,初始化分组数量 groups 为 0。

  4. 分组过程:
    ◦ 当 left 小于等于 right 时,进入循环:
    ◦ 如果 left 等于 right,说明只剩下一个纪念品,将分组数量加 1 并跳出循环。
    ◦ 如果价格最小和最大的纪念品价格之和不超过价格上限 w ,则将它们分为一组,left 指针右移一位,right 指针左移一位,分组数量加 1。
    ◦ 如果价格最小和最大的纪念品价格之和超过价格上限 w ,则将价格最大的纪念品单独分为一组,right 指针左移一位,分组数量加 1。

  5. 输出结果:循环结束后,输出分组的数量。

【代码示例】

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int w, n;
    // 读取每组纪念品价格上限 w 和纪念品数量 n
    cin >> w;
    cin >> n;
    // 使用 n 来初始化 vector 的大小
    vector<int> P(n);
    // 读取每个纪念品的价格
    for (int i = 0; i < n; i++) {
        cin >> P[i];
    }
    // 对纪念品价格从小到大排序
    sort(P.begin(), P.end());
    // 双指针法分组
    int left = 0;
    int right = n - 1;
    // 初始化分组数量为 0
    int groupCount = 0;
    while (left <= right) {
        if (left == right) {
            // 若只剩一个纪念品,单独成一组
            groupCount += 1;
            break;
        }
        if (P[left] + P[right] <= w) {
            // 若最小和最大价格的纪念品能分在一组
            groupCount += 1;
            left += 1;
            right -= 1;
        } else {
            // 若不能,最大价格的纪念品单独成一组
            right -= 1;
            groupCount += 1;
        }
    }
    // 输出最少的分组数量
    cout << groupCount << endl;
    return 0;
}

注意:

双指针一般是整数类型的索引,而非指针类型

②使用 n 来初始化 vector 的大小

③将groupCount初始化为0,避免未定义行为

相关文章:

  • (八)Java-Collection
  • Ray生产集群配置
  • 图像处理基础(8):图像的灰度直方图、直方图均衡化、直方图规定化(匹配)
  • 目标检测YOLO实战应用案例100讲-面向无人机图像的小目标检测
  • 1.2.2 使用Maven方式构建Spring Boot项目
  • GPT1 与 GPT2 的异同
  • 数字内容体验案例分析的核心优势是什么?
  • 【Python pro】函数
  • 处理AAL的.nii文件:python获取AAL的各个区域的质心坐标
  • Go红队开发—语法补充
  • 同价位usb网卡与pcie网卡网速差距实测 热点测试
  • JavaScript 简单类型与复杂类型-复杂类型的内存分配
  • 智慧隧道与智慧城市融合发展——塔能物联运维的持之以恒
  • 同步fifo和异步fifo
  • ARM架构各版本内核处理器总结
  • 线程安全问题
  • Hadoop最新版本hadoop-3.4.1搭建伪分布式集群以及相关报错解决
  • 减少内存占用的两种方法|torch.no_grad和disable_torch_init
  • python-leetcode-最长公共子序列
  • 从二维随机变量到多维随机变量
  • 马上评|训斥打骂女儿致死,无暴力应是“管教”底线
  • 上海虹桥国际咖啡文化节开幕,推出茶咖文化特色街区、宝妈咖啡师培训
  • 一周文化讲座|“我的生命不过是温柔的疯狂”
  • 龚正会见哥伦比亚总统佩特罗
  • 辽宁盘山县一乡镇幼儿园四名老师被指多次殴打一女童,均被行拘
  • ESG考证虚火:相比证书,知识结构+实战经验更重要