Professional Documents
Culture Documents
13一等奖冲刺 贪心法 主讲:杜瑜皓
13一等奖冲刺 贪心法 主讲:杜瑜皓
杜瑜皓
2016 年 10 月 22 日
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
自我介绍
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
自我介绍
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
自我介绍
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
自我介绍
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
贪心算法
每一步考虑局部最优解,从而达到局部最优解。
相信大家都知道贪心是什么,我们来做几个题吧。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
旅行家的预算
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市
(假设出发时油箱是空的)。
给定两个城市之间的距离 d1 ,汽车油箱的容量 c,每升汽油能
行驶的距离 d2 。
出发点每升汽油价格 p 和沿途油站数 n,油站 i 离出发点的距
离 di 、每升汽油价格 pi 。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
从左到右一个一个考虑每个加油站,终点当成费用为 0 的加油
站。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
从左到右一个一个考虑每个加油站,终点当成费用为 0 的加油
站。
c
如果这个加油站代价在往后 d2
的位置的加油站中最小,那就
一定加满。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
从左到右一个一个考虑每个加油站,终点当成费用为 0 的加油
站。
c
如果这个加油站代价在往后 d2
的位置的加油站中最小,那就
一定加满。
否则将油箱加到能到下一个代价比它小的加油站,接着考虑下
一个加油站。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
从左到右一个一个考虑每个加油站,终点当成费用为 0 的加油
站。
c
如果这个加油站代价在往后 d2
的位置的加油站中最小,那就
一定加满。
否则将油箱加到能到下一个代价比它小的加油站,接着考虑下
一个加油站。
正确性显然?
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Huffman coding
合并果子
荷马史诗 (k 进制编码的推广)
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
每次选择频率最小两个的合并。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
每次选择频率最小两个的合并。
不存在最深的叶节点为最小两个,可以调整。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
每次选择频率最小两个的合并。
不存在最深的叶节点为最小两个,可以调整。
对于 k 进制首先补 0 是的每个节点恰好能有 k 个儿子,然后
每次选择频率最小的 k 个合并。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
随机数生成器
一个 n ∗ m 的排列,上面填着 1 到 n ∗ m 的整数排列。
求一条从 (1, 1) 到 (n, m) 的路径,每一步只能往右和往下走。
路径的权值为路径上数字排序之后的序列,求权值字典序最小
的路径。
n, m ≤ 5000
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
任务调度
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
任务调度
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
任务调度
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
任务调度
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Exchange Argument
设计贪心算法中常用技巧。
同时也能证明正确性。
就是对于一个序列考虑如果交换相邻两个元素,可以得到一些
序的关系。
如果这个序的关系为全序,那么就可以使用贪心解决。
例题:国王游戏
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
很遗憾这是错的。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
很遗憾这是错的。
假设 4 台机器,时间分别为 2, 3, 3, 3,请大家构造一下方案。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Swap Space
你需要格式化很多硬盘。格式化硬盘可能使它的容量发生变
化。
格式化之前,你要把该硬盘上所有数据移到一个或更多的其他
硬盘上,该硬盘可以立刻开始使用。
为了格式化,你需要买额外的硬盘。当然,你想要买容量最小
的额外储存设备以便省钱。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Swap Space
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
首先将硬盘分成能增加容量和减小容量的。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
首先将硬盘分成能增加容量和减小容量的。
显然优先选择能增加容量的硬盘。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
首先将硬盘分成能增加容量和减小容量的。
显然优先选择能增加容量的硬盘。
然后增加容量的硬盘,按照起始容量从小到大排序。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
首先将硬盘分成能增加容量和减小容量的。
显然优先选择能增加容量的硬盘。
然后增加容量的硬盘,按照起始容量从小到大排序。
因为每次剩余容量都是增加的,所以选择起始容量小的一定更
优。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
对于减小容量的,我们倒过来考虑。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
对于减小容量的,我们倒过来考虑。
比如还剩 7 的容量,经过 (6, 2) 这样的硬盘之后,还剩 3 的容
量。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
对于减小容量的,我们倒过来考虑。
比如还剩 7 的容量,经过 (6, 2) 这样的硬盘之后,还剩 3 的容
量。
倒过来就变成了容量为 3,扩容成了 7。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
对于减小容量的,我们倒过来考虑。
比如还剩 7 的容量,经过 (6, 2) 这样的硬盘之后,还剩 3 的容
量。
倒过来就变成了容量为 3,扩容成了 7。
所以按结束容量从大到小排序,贪心。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Socket
你只有一个插座,但是有 m 个设备需要被充电。
你有 n 个接线板,第 i 个接线板有 ai 个口。
但对于每个设备,有权值 bj 表示它到初始插座的距离不能超
过 bj ,如果 bj = 0 那么只能直接插到初始插座上。
问最多能同时给多少个设备充电。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
接线板一定会优先选择插口比较多的。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
接线板一定会优先选择插口比较多的。
然后设备一定优先选择 bj 比较大的。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
接线板一定会优先选择插口比较多的。
然后设备一定优先选择 bj 比较大的。
考虑一堆设备能不能都被供电。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
按深度限制从小到大排序,能不插电器尽量不插。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
按深度限制从小到大排序,能不插电器尽量不插。
然后二分答案即可。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
TopoCM++
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
贪心 +dp
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Moneymanager
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Moneymanager
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Moneymanager
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Moneymanager
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Moneymanager
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
TaroCutting
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
首先只关注每棵树最后一次被砍的时候,一棵树被砍可以当成
直接变成 di ,否则就是不砍。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
首先只关注每棵树最后一次被砍的时候,一棵树被砍可以当成
直接变成 di ,否则就是不砍。
考虑从还剩 j 天开始,如果一棵树被砍了,那么代价为
di + j ∗ ai 。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
首先只关注每棵树最后一次被砍的时候,一棵树被砍可以当成
直接变成 di ,否则就是不砍。
考虑从还剩 j 天开始,如果一棵树被砍了,那么代价为
di + j ∗ ai 。
所以会按 ai 从小到大看。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
首先只关注每棵树最后一次被砍的时候,一棵树被砍可以当成
直接变成 di ,否则就是不砍。
考虑从还剩 j 天开始,如果一棵树被砍了,那么代价为
di + j ∗ ai 。
所以会按 ai 从小到大看。
令 dpi,j,k 表示前 i 个砍到第 j 天这天还剩 k 个的高度和。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
MagicalRocketCar
n 个加速器 ai , bi ,两种加速模式。
第一种是保持 ai /bi 的加速度 bi 时间,第二种是保持 bi /ai 的
加速度 ai 时间。
求最大行驶的距离。
n ≤ 100, ai , bi ≤ 100
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
首先画到平面上,发现加速器对应的线段斜率一定递增。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
首先画到平面上,发现加速器对应的线段斜率一定递增。
按线段斜率排序,每个线段放在头或尾。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
首先画到平面上,发现加速器对应的线段斜率一定递增。
按线段斜率排序,每个线段放在头或尾。
dpi,s 表示前 i 个线段,放在头的 y 坐标和为 s 的最大面积。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
House Moving
有 m 个数字,第 i 个数字的权值是 ai 。
然后给这 i 个数字分配 1 到 n 的位置 pi ,要求分配的位置不
同。
∑
要求最大化 1≤i<j≤m ai ∗ aj ∗ |pi − pj |。
m ≤ 1000, ai ≤ 100。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
首先观察这些数字尽量往两边放。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
首先观察这些数字尽量往两边放。
这些数字从大到小排序,每个选择放到头或者尾。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution
首先观察这些数字尽量往两边放。
这些数字从大到小排序,每个选择放到头或者尾。
dpi,s 表示前 i 个数,放在头里的数字和为 s,然后最大的代价。
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心