贪心
总结和反思
-
什么时候可以用贪心,什么时候用dp,什么时候用搜索,什么时候用暴力这个需要积累下
- TODO
- 贪心和暴力枚举组合,能贪心的时候贪心,不能贪心的时候就都试一下
-
贪心的思路
- 寻找贪心策略
- (优化解空间)可以类似搜索,先暴力枚举一下当前的选择,想下怎么想对当前的选择排序,从而选出最优解,从而确定贪心的策略
- (从解空间中抽取答案)配合淘汰策略,在排序的集合中选择最优解
- 验证贪心正确性
- 寻找贪心策略
-
贪心的几种认识
- 一种是思维题,就是考你对当前问题模型的贪心的最优解,然后模拟实现出来(重要的思维+模拟)
- 几种可以抽象对照贪心模型
- 区间贪心
- 一维(对边的排序-->按找顺序进行判断-->满足条件的边-->维护限制/进行对于操作)
- 尽可能找多的边来覆盖
- 尽可能找少的边来覆盖
- 尽可能覆盖的多
- 尽可能让边重合
- 二维
- 降维处理
- 联系坐标系
- 一维(对边的排序-->按找顺序进行判断-->满足条件的边-->维护限制/进行对于操作)
- 坐标系下贪心
- 区间贪心
题号
-
PIPIOJ 1016(简单贪心)
-
PIPIOJ 1208(简单贪心)
-
PIPIOJ 1253(简单贪心)
-
PIPIOJ 1125(区间贪心)
-
PIPIOJ 1121(区间贪心)
-
PIPIOJ 1172(区间贪心)
-
PIPIOJ 1323(区间贪心)
-
PIPIOJ 1028 可乐(思维+贪心)
-
PIPIOJ 1255 最大容量和(思维+贪心)
-
PIPIOJ 1143 堆石子(优先队列+贪心)
-
PIPIOJ 1386 程序员PIPI(优先队列+区间贪心)
-
PIPIOJ 1120 木匠PIPI (作业)
-
PIPIOJ 1127 司机问题(作业)
分析
-
1016
- 贪心就是尽可能让在车能到下一个加油站的前提下把油用光
-
1208
- 这题一开始看错了,还以为是和之前一天使用1034单调队列求最小字典序的子序列问题,区别在于这题没有必要按序,所以直接排序选择就好了
-
1125
- 区间贪心,尽可能的多选区间个数填充目标
- 按后点升序排序
- 从前面选择满足条件的添加
- 区间贪心,尽可能的多选区间个数填充目标
-
1121
- 区间贪心,尽可能的少选区间填充目标
- 按前点和后点都升序排序
- 从前面循环所有满足当前条件的边,在其中选择最右边的边,进行添加
- 如果不满足条件再添加新边
- 区间贪心,尽可能的少选区间填充目标
-
1172
- 这题就是区间的转化,区别就是区间是double类型了
- 区间贪心,尽可能的少选
- 按区间前点和后点升序排序
- 从前往后,选择满足条件就跳过,不满足,新增边
-
1323
- 区间贪心,尽可能的多选边来构成较少的区间个数
- 按前点和后点升序排序,对于满足条件的维护限制,不满足的新增区间(区分1121,都是类似,1121要求选择最少边来覆盖,而1323选择知道覆盖了多少,不在乎选择边的多少,所以1121在选择边的时候,对于所有满足条件的边,只能选择最优的一个,而1323只要满足条件,就可以都要)
- 区间贪心,尽可能的多选边来构成较少的区间个数
-
1028
- 贪心,这题随着条件的变化,贪心策略需要变化(能贪心的贪心,不确定贪心的暴力枚举)
- 当v是大于可乐的容量,就选择性价比最高的买
- 当小于的时候,不确定是多花点钱多买一点可乐和去买性价比更低的花销大还是小,这题使用了暴力枚举的方式去寻找最优解(暴力写的很优雅)
- 贪心,这题随着条件的变化,贪心策略需要变化(能贪心的贪心,不确定贪心的暴力枚举)
-
1255
- 这题贪心的思路我想错了几次,都没仔细论证贪心的策略是不是对的就写了,浪费了很多时间
- 贪心就是选择所有满足的条件的木板,如果按小到大排序,在剩下木板足够组合成为新的桶的条件下,选择尽可能让小的抱团,从而让长的木板发挥更大的作用
- 这题贪心的思路我想错了几次,都没仔细论证贪心的策略是不是对的就写了,浪费了很多时间
-
1143
- 优先队列
-
1386
- 多条轴进行区间贪心,选择尽可能少的轴数
- 按前点和后点降序排序,使用优先队列来维护不同轴的限制
- 当满足条件,就更新轴的限制,不满足,就添加新轴
- 多条轴进行区间贪心,选择尽可能少的轴数
-
1120
- 这题可以转化为二维坐标系的贪心或者理解为二维的贪心
- 这题和1386有点想,就是区别在于大小不好确定,所以我卡了这半天
- 如果从二维贪心出发,确定一个点,降维成为一维,在每一个维度都进行贪心,合并后也是全局的贪心,更好理解
- 这题可以转化为二维坐标系的贪心或者理解为二维的贪心