csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:纪念品分组

csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:纪念品分组

题目描述

元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。

你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。

输入格式

共 n + 2 n+2 n+2 行:

第一行包括一个整数 w w w,为每组纪念品价格之和的上限。

第二行为一个整数 n n n,表示购来的纪念品的总件数 G G G。

第 3 ∼ n + 2 3\sim n+2 3∼n+2 行每行包含一个正整数 P i P_i Pi 表示所对应纪念品的价格。

输出格式

一个整数,即最少的分组数目。

输入输出样例 1
输入 1
复制代码
100 
9 
90 
20 
20 
30 
50 
60 
70 
80 
90
输出 1
复制代码
6
说明/提示

50 % 50\% 50% 的数据满足: 1 ≤ n ≤ 15 1\le n\le15 1≤n≤15。

100 % 100\% 100% 的数据满足: 1 ≤ n ≤ 3 × 10 4 1\le n\le3\times10^4 1≤n≤3×104, 80 ≤ w ≤ 200 80\le w\le200 80≤w≤200, 5 ≤ P i ≤ w 5 \le P_i \le w 5≤Pi≤w。

AC代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;  
const int N=3e4+10; // 定义足够大的数组大小,防止溢出
int w,n,cnt=0;       // w为每组价格上限,n为纪念品数量,cnt记录最少分组数
int a[N];            // 存储各纪念品的价格

int main(){  
    cin>>w>>n;
    for(int i=1;i<=n;i++) cin>>a[i]; // 输入纪念品价格
    sort(a+1,a+n+1); // 将价格升序排序,便于后续双指针贪心匹配

    int left=1,right=n; // 双指针初始化,分别指向最小和最大元素
    while(left<right){
        // 尝试将最大和最小元素配对
        if(a[left]+a[right]>w){ 
            right--;    // 价格超限,单独处理当前最大值
            cnt++;      // 分组数+1
        } else {        
            left++;     // 配对成功,移动双指针缩小范围
            right--;
            cnt++;      // 分组数+1
        }
    }
    // 处理剩余单个元素的情况
    if(left==right) cnt++;
    cout<<cnt;
    return 0;  
}

功能分析

  1. 输入处理与排序:首先读入每组价格上限和纪念品总数,接着将所有纪念品价格存入数组并升序排序。排序后便于使用双指针策略高效配对。

  2. 双指针贪心匹配:初始化左指针指向最小元素,右指针指向最大元素。循环尝试将当前最大元素与最小元素配对:

    • 若两者之和不超过价格上限,则成功配对,双指针向中间移动,分组数+1。
    • 若超出上限,则单独处理最大元素(右指针左移),分组数+1。
  3. 处理剩余元素:循环结束后,若左右指针重合,说明剩余一个未处理元素,单独成组。

该算法时间复杂度为O(n log n),主要由排序步骤决定,适用于题目给定的数据规模(n ≤ 3×10^4)。通过每次尽可能合并大值和小值,确保分组数最少,符合贪心选择性质。

各种学习资料,助力大家一站式学习和提升!!!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"##########  一站式掌握信奥赛知识!  ##########";
	cout<<"#############  冲刺信奥赛拿奖!  #############";
	cout<<"######  课程购买后永久学习,不受限制!   ######";
	return 0;
}

【秘籍汇总】(完整csp信奥赛C++学习资料):

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

https://edu.csdn.net/course/detail/41081 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转

4、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新): https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转

5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转

· 文末祝福 ·

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"跟着王老师一起学习信奥赛C++";
	cout<<"    成就更好的自己!       ";
	cout<<"  csp信奥赛一等奖属于你!   ";
	return 0;
}
相关推荐
fpcc7 小时前
ubuntu26环境下的开发环境安装处理
c++·并行编程
致Great8 小时前
科研人的 AI,不该只回答问题:我用字节TraeWork 跑了一遍真实研究任务
算法
纵有疾風起8 小时前
线性表的定义与基本操作 — 从逻辑结构到 ADT 接口
数据结构·算法·408·线性表·adt
charlie1145141919 小时前
Cinux · 第一次跳进 Ring 3:用户态与特权隔离
开发语言·c++·操作系统·开源项目
别动我齐刘海9 小时前
机器学习基础2——C++、OpenCV、点云、Open3D
c++·人工智能·opencv·机器学习·计算机视觉·机器人·ros2
测试_AI_一辰9 小时前
AI Agent 评测最隐蔽的坑-记忆
人工智能·算法·ai·自动化·ai编程
躺不平的理查德9 小时前
Windows C++ 第三方库使用流程备忘录--OpenCV
开发语言·c++
余额瞒着我当琳9 小时前
C++STL容器string--迭代器,string的接口,string的遍历,访问方式
c++
郭涤生9 小时前
rootfs 详解与裁剪优化记录
linux·c++·bsp
lucas_AI9 小时前
给YOLO检测器插 LoRA,'插对地方'比'插什么'更要命
人工智能·算法