【题目链接】

ybt 1939:【07NOIP普及组】纪念品分组
洛谷 P1094 [NOIP2007 普及组] 纪念品分组

【题目考点】

1. 贪心

【解题思路】

贪心选择:选择价格最小的和最大的纪念品分成一组,若价格最小的和最大的纪念品无法
分成一组,那么价格最大的纪念品单独一组。

将问题抽象为:有n个数字,要凑成加和小于等于w的组,一组可以有2个数或1个数,最少可以凑多少组。

1. 贪心选择性质的证明:

贪心选择:
如果最大值加最小值大于w,那么最大值单独一组。
如果最大值加最小值小于等于w,最大最小值凑成一组。

  1. 证明:存在最优解包含第一次贪心选择

如果第一次选择的组只有最大值,由于最大值无法和其他数字凑成一组,最大值单独一组是唯一的选择。
如果第一次的贪心选择是最大最小值构成的一组。设最大值为lll,最小值为ggg,那么一定有:l+g≤wl+g\le wl+g≤w
假设对于所有最优解,都不包含第一次的贪心选择,也就是说lll和ggg不会分为一组。
lll可以有以下几种情况

  1. lll单独一组:无论ggg与另一个数字一组,还是ggg单独一组,都可以让ggg更改为与lll一组。
  2. lll与另一个数字xxx一组,那么有l+x≤wl+x\le wl+x≤w。
    假设此时ggg单独一组,那么可以让ggg与xxx交换,得到lll与ggg一组。
    假设此时ggg与另一个数字hhh一组,那么有h+g≤wh+g\le wh+g≤w
    由于lll是当时的最大值,那么一定有h≤lh\le lh≤l,所以有h+x≤l+x≤wh+x\le l+x\le wh+x≤l+x≤w,hhh与xxx一组加和并不会超过www。 将ggg与xxx交换,lll与ggg一组,hhh与xxx一组,是可行的。
    无论什么情况,都可以通过交换使得lll与ggg一组,这样做分组数量不会增加,该方案仍然是最优解,最优解中包含了贪心选择,与假设相悖,原命题得证。
  1. 证明:进行k次贪心选择后,存在最优解包含第k+1次的贪心选择。

证明方法与证明第1点相似,不再赘述。

2.具体做法:

对所有纪念品按升序排序,设l,r两个指针指向当前看到的价格最小和最大的纪念品。

  • 如果第l和第r个纪念品的价格加和大于w,那么第l纪念品单独一组,l加1。
  • 如果第l和第r个纪念品的价格加和小于等于w,那么第l和第r纪念品分为一组,l和r都加1。

【题解代码】

解法1:贪心

#include<bits/stdc++.h>
using namespace std;
#define N 30005
int main()
{int p[N], w, n, ct = 0;//ct:组数cin >> w >> n;for(int i = 1; i <= n; ++i)cin >> p[i];sort(p+1, p+1+n);int l = 1, r = n;while(l <= r){if(l != r && p[l] + p[r] <= w){l++;r--;ct++;//l, r凑一组}else{r--;ct++;//r自己凑一组 }}cout << ct;return 0;
}

信息学奥赛一本通 1939:【07NOIP普及组】纪念品分组 | P1094 [NOIP2007 普及组] 纪念品分组相关推荐

  1. 信息学奥赛一本通 1096:数字统计 | 1949:【10NOIP普及组】数字统计 | OpenJudge NOI 1.5 41

    [题目链接] ybt 1096:数字统计 ybt 1949:[10NOIP普及组]数字统计 OpenJudge NOI 1.5 41:数字统计 [题目考点] 1. 分离整数的各位数字 对于数字a,a% ...

  2. 信息学奥赛一本通 1089:数字反转 | 1953:【11NOIP普及组】数字反转 | OpenJudge NOI 1.5 29 | 洛谷 P1307 [NOIP2011 普及组] 数字反转

    [题目链接] ybt 1089:数字反转 ybt 1953:[11NOIP普及组]数字反转 OpenJudge NOI 1.5 29:数字反转 洛谷 P1307 [NOIP2011 普及组] 数字反转 ...

  3. 信息学奥赛一本通 1098:质因数分解 | 1957:【12NOIP普及组】质因数分解 | OpenJudge NOI 1.5 43 | 洛谷 P1075 [NOIP2012 普及组] 质因数分解

    [题目链接] ybt 1098:质因数分解 ybt 1957:[12NOIP普及组]质因数分解 OpenJudge NOI 1.5 43:质因数分解 洛谷 P1075 [NOIP2012 普及组] 质 ...

  4. 信息学奥赛一本通 1118:铺地毯 | 1863:【11NOIP提高组】铺地毯 | OpenJudge NOI 1.9 14 | 洛谷 P1003 [NOIP2011 提高组] 铺地毯

    [题目链接] ybt 1118:铺地毯 ybt 1863:[11NOIP提高组]铺地毯 OpenJudge NOI 1.9 14:铺地毯 洛谷 P1003 [NOIP2011 提高组] 铺地毯 [题目 ...

  5. 信息学奥赛一本通(C++版)NOIP提高组(1820-1829)

    信息学奥赛一本通(C++版)NOIP提高组目录 //1820 [题目描述] 我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所 处位置的(值减1)为指数,以10为底数的幂之和的 ...

  6. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  7. 信息学奥赛一本通(C++版) 网站补充题目

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 网站补充题目 http://ybt.ssoier ...

  8. 信息学奥赛一本通在线提交地址

    信息学奥赛一本通 1 C++语言入门 1.1 综合 1.1.1 P1458 地球人口承载力估计 正确: 770 提交: 1794 比率: 42.92 % 1.1.2 P1686 Hello, Worl ...

  9. 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划 第一节 动 ...

最新文章

  1. 【转】闲聊Kernel engineer的境界(全)
  2. json阅读器_Flutter小说阅读器系列一:使用Bloc模式获取起点小说关键字提示
  3. linux调用堆栈函数,使用 backtrace 获得 Linux 函数调用栈
  4. centos7抢先安装docker1.0
  5. PHP截取文件,[转载]php做截取文件后缀名大全
  6. Jzoj3882 近邻
  7. 知识库 编号:003
  8. Java jdk的下载与安装
  9. poi 操作 PPT,针对 PPTX--表格简单操作
  10. 关系模型中的3中关系(一对一,一对多,多对多)
  11. 2021-最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)---JavaScript篇
  12. 自学平面设计,不能不知道的基础知识点是什么?
  13. 微信小程序常见问题记录
  14. IoT通讯技术选型及模型设计的思考
  15. 用python做一个随机题目生成器
  16. 晚上失眠白天没精神,怎么把这种状态调整回来!
  17. MySQL5.6建索引时遇到 Specified key was too long; max key length is 767 bytes错误提示解决办法
  18. 导数在梯度下降算法中的意义理解
  19. hihocoder 1272 买零食
  20. 电气隔离 电源模块 升压/充电 实测案例 150V 30W 带四个220UF电解电容并联 300ms

热门文章

  1. 写个随笔解解闷-书签漫游
  2. 数据库设计三大范式应用实例剖析
  3. 56秒看完131年英格兰顶级联赛冠军排行:利物浦时隔30年再夺冠
  4. Python传奇:30年崛起之路
  5. 黑客魔术!如何黑掉一台根本不联网的电脑
  6. java 内核驱动程序_内核第三讲,进入ring0,以及编写第一个内核驱动程序.
  7. InnoDB原理篇:Change Buffer是如何提升索引性能的?
  8. Dubbo 新增本地 IDE 插件,快速创建样例工程
  9. DevOps是什么意思
  10. TOMCAT内存溢出问题