You are on page 1of 88

贪心

杜瑜皓

2016 年 10 月 22 日

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
自我介绍

NOIp 2010-2014 提高组一等奖

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
自我介绍

NOIp 2010-2014 提高组一等奖


IOI2015 Au

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
自我介绍

NOIp 2010-2014 提高组一等奖


IOI2015 Au
目前就读于清华大学交叉信息研究院

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
自我介绍

NOIp 2010-2014 提高组一等奖


IOI2015 Au
目前就读于清华大学交叉信息研究院
apiadu17a6@gmail.com

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
贪心算法

每一步考虑局部最优解,从而达到局部最优解。
相信大家都知道贪心是什么,我们来做几个题吧。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
旅行家的预算

一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市
(假设出发时油箱是空的)。
给定两个城市之间的距离 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

逐位确定,即从 1 枚举到 n ∗ m 看当前的数字能不能加入路径


中。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

逐位确定,即从 1 枚举到 n ∗ m 看当前的数字能不能加入路径


中。
维护每行的可行区间。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
任务调度

有 n 个任务 [si , di ] 找最多的任务不相交。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
任务调度

有 n 个任务 [si , di ] 找最多的任务不相交。


有 n 个任务一台机器,每个任务 ddl 为 di ,时间为 ti 。如果一
个任务在 fi (fi > di ) 完成,那么它的延迟为 fi − di ,求任务安排
方式使得最大延迟最小。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
任务调度

有 n 个任务 [si , di ] 找最多的任务不相交。


有 n 个任务一台机器,每个任务 ddl 为 di ,时间为 ti 。如果一
个任务在 fi (fi > di ) 完成,那么它的延迟为 fi − di ,求任务安排
方式使得最大延迟最小。
有 n 个任务,出现时间为 si ,ddl 为 di ,时间为 ti ,问这些任
务能否都完成?

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
任务调度

有 n 个任务 [si , di ] 找最多的任务不相交。


有 n 个任务一台机器,每个任务 ddl 为 di ,时间为 ti 。如果一
个任务在 fi (fi > di ) 完成,那么它的延迟为 fi − di ,求任务安排
方式使得最大延迟最小。
有 n 个任务,出现时间为 si ,ddl 为 di ,时间为 ti ,问这些任
务能否都完成?
有 m 台机器,第 i 台机器需要 ti 秒复制一份文件。一开始只
有一份文件,问复制到 n 份需要最小的时间。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 n 个任务 [si , di ] 找最多的任务不相交。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 n 个任务 [si , di ] 找最多的任务不相交。


每次选能选择的右端点最小的。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 n 个任务 [si , di ] 找最多的任务不相交。


每次选能选择的右端点最小的。
正确性显然。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 n 个任务一台机器,每个任务 ddl 为 di ,时间为 ti 。如果一


个任务在 fi (fi > di ) 完成,那么它的延迟为 fi − di ,求任务安排
方式使得最大延迟最小。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 n 个任务一台机器,每个任务 ddl 为 di ,时间为 ti 。如果一


个任务在 fi (fi > di ) 完成,那么它的延迟为 fi − di ,求任务安排
方式使得最大延迟最小。
方法 1:二分答案然后倒着判断,正确性显然。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 n 个任务一台机器,每个任务 ddl 为 di ,时间为 ti 。如果一


个任务在 fi (fi > di ) 完成,那么它的延迟为 fi − di ,求任务安排
方式使得最大延迟最小。
方法 1:二分答案然后倒着判断,正确性显然。
方法 2:按 di 排序,正确性不显然。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 n 个任务一台机器,每个任务 ddl 为 di ,时间为 ti 。如果一


个任务在 fi (fi > di ) 完成,那么它的延迟为 fi − di ,求任务安排
方式使得最大延迟最小。
方法 1:二分答案然后倒着判断,正确性显然。
方法 2:按 di 排序,正确性不显然。
方法 3:按 di 排序,ti 排序,di + ti 排序,di − ti 取最小值,
在你不知道正确性的情况下很有可能正确。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

假设两个相邻的任务为 (d1 , t1 ), (d2 , t2 ) 且 d1 > d2 ,从 S 时刻


开始做。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

假设两个相邻的任务为 (d1 , t1 ), (d2 , t2 ) 且 d1 > d2 ,从 S 时刻


开始做。
这两个任务的贡献为 max(S + t1 − d1 , S + t1 + t2 − d2 )。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

假设两个相邻的任务为 (d1 , t1 ), (d2 , t2 ) 且 d1 > d2 ,从 S 时刻


开始做。
这两个任务的贡献为 max(S + t1 − d1 , S + t1 + t2 − d2 )。
如果交换这两个任务,贡献为 max(S + t2 − d2 , S + t1 + t2 − d1 )。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

假设两个相邻的任务为 (d1 , t1 ), (d2 , t2 ) 且 d1 > d2 ,从 S 时刻


开始做。
这两个任务的贡献为 max(S + t1 − d1 , S + t1 + t2 − d2 )。
如果交换这两个任务,贡献为 max(S + t2 − d2 , S + t1 + t2 − d1 )。
于是有 t2 − d2 ≤ t1 + t2 − d2 , t1 + t2 − d1 ≤ t1 + t2 − d2 ,结果
不会变劣。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Exchange Argument

设计贪心算法中常用技巧。
同时也能证明正确性。
就是对于一个序列考虑如果交换相邻两个元素,可以得到一些
序的关系。
如果这个序的关系为全序,那么就可以使用贪心解决。
例题:国王游戏

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 n 个任务,出现时间为 si ,ddl 为 di ,时间为 ti ,问这些任


务能否都完成?

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 n 个任务,出现时间为 si ,ddl 为 di ,时间为 ti ,问这些任


务能否都完成?
NP-complete

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 m 台机器,第 i 台机器需要 ti 秒复制一份文件。一开始只


有一份文件,问复制到 n 份需要最小的时间。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 m 台机器,第 i 台机器需要 ti 秒复制一份文件。一开始只


有一份文件,问复制到 n 份需要最小的时间。
让每台机器尽早地开始工作。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 m 台机器,第 i 台机器需要 ti 秒复制一份文件。一开始只


有一份文件,问复制到 n 份需要最小的时间。
让每台机器尽早地开始工作。
按 ti 排序考虑每台机器,如果有空机器就把复制出来的一份
给空机器,另一份自己接着复印。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

有 m 台机器,第 i 台机器需要 ti 秒复制一份文件。一开始只


有一份文件,问复制到 n 份需要最小的时间。
让每台机器尽早地开始工作。
按 ti 排序考虑每台机器,如果有空机器就把复制出来的一份
给空机器,另一份自己接着复印。
正确性?

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

很遗憾这是错的。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

很遗憾这是错的。
假设 4 台机器,时间分别为 2, 3, 3, 3,请大家构造一下方案。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Swap Space

你需要格式化很多硬盘。格式化硬盘可能使它的容量发生变
化。
格式化之前,你要把该硬盘上所有数据移到一个或更多的其他
硬盘上,该硬盘可以立刻开始使用。
为了格式化,你需要买额外的硬盘。当然,你想要买容量最小
的额外储存设备以便省钱。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Swap Space

举个例子,假设你有 4 个硬盘 A,B,C,D 容量分别为 6, 1, 3, 3。


新的文件系统下,它们的容量变为 6, 7, 5, 5。
如果你只买 1 额外空间,你可以把 B 硬盘的数据放过去然后
格式化硬盘 B。现在你的 B 硬盘有 7 容量了,那么你就可以
把 A 的数据放过去然后格式化 A,最后把 C,D 的数据放到 A
上,再格式化 C 和 D。
n ≤ 105 。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
首先将硬盘分成能增加容量和减小容量的。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
首先将硬盘分成能增加容量和减小容量的。
显然优先选择能增加容量的硬盘。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
首先将硬盘分成能增加容量和减小容量的。
显然优先选择能增加容量的硬盘。
然后增加容量的硬盘,按照起始容量从小到大排序。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
首先将硬盘分成能增加容量和减小容量的。
显然优先选择能增加容量的硬盘。
然后增加容量的硬盘,按照起始容量从小到大排序。
因为每次剩余容量都是增加的,所以选择起始容量小的一定更
优。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
对于减小容量的,我们倒过来考虑。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
对于减小容量的,我们倒过来考虑。
比如还剩 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++

有一个比赛,一共 n 个题目,每个题目有一个 ddldi ,同时还


有想题时间 ai 和写题时间 bi 。
同时还有两个时间 f1 ,f2 ,表示从想题变成写题和从写题变成想
题要花的时间。
你要安排想题和写题顺序 (不需要一个题想完之后立刻写),使
得最大延迟最小。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

首先二分答案,变成判定能不能在 ddl 前完成。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

首先二分答案,变成判定能不能在 ddl 前完成。


按 ddl 排序,要求转换尽量越少越好。每次一定是连续想一段
题,接着写一段题。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

首先二分答案,变成判定能不能在 ddl 前完成。


按 ddl 排序,要求转换尽量越少越好。每次一定是连续想一段
题,接着写一段题。
每次能选就尽量选。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
贪心 +dp

使用贪心或 Exchange Argument 确定 dp 的顺序或者减掉一些


不优的状态。
然后 dp

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Moneymanager

有一个 project 由 n 个任务构成,每个任务有两个属性 (ai , bi )。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Moneymanager

有一个 project 由 n 个任务构成,每个任务有两个属性 (ai , bi )。


如果完成了第 i 个任务,那么你的能力值会增加 ai ,你的收入
会增加那个 bi ∗ E,其中 E 是你的当前经验值。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Moneymanager

有一个 project 由 n 个任务构成,每个任务有两个属性 (ai , bi )。


如果完成了第 i 个任务,那么你的能力值会增加 ai ,你的收入
会增加那个 bi ∗ E,其中 E 是你的当前经验值。
你在完成了恰好一半任务之后还能去参加培训,参加完培训你
能增加 X 的能力值。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Moneymanager

有一个 project 由 n 个任务构成,每个任务有两个属性 (ai , bi )。


如果完成了第 i 个任务,那么你的能力值会增加 ai ,你的收入
会增加那个 bi ∗ E,其中 E 是你的当前经验值。
你在完成了恰好一半任务之后还能去参加培训,参加完培训你
能增加 X 的能力值。
请问你最多能赚多少钱。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
Moneymanager

有一个 project 由 n 个任务构成,每个任务有两个属性 (ai , bi )。


如果完成了第 i 个任务,那么你的能力值会增加 ai ,你的收入
会增加那个 bi ∗ E,其中 E 是你的当前经验值。
你在完成了恰好一半任务之后还能去参加培训,参加完培训你
能增加 X 的能力值。
请问你最多能赚多少钱。
n ≤ 50, bi ≤ 10, ai , x ≤ 105

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

首先不考虑培训,考虑交换相邻两个元素 (a1 , b1 ), (a2 , b2 )。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

首先不考虑培训,考虑交换相邻两个元素 (a1 , b1 ), (a2 , b2 )。


那么收入为 b1 ∗ E + b2 ∗ (E + a1 ) 与 b2 ∗ E + b1 ∗ (E + a2 )。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

首先不考虑培训,考虑交换相邻两个元素 (a1 , b1 ), (a2 , b2 )。


那么收入为 b1 ∗ E + b2 ∗ (E + a1 ) 与 b2 ∗ E + b1 ∗ (E + a2 )。
于是按 ai /bi 从大到小排序。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

首先不考虑培训,考虑交换相邻两个元素 (a1 , b1 ), (a2 , b2 )。


那么收入为 b1 ∗ E + b2 ∗ (E + a1 ) 与 b2 ∗ E + b1 ∗ (E + a2 )。
于是按 ai /bi 从大到小排序。
能力值增加 a 的的贡献为 a 乘上之后所有 bi 的和。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

首先不考虑培训,考虑交换相邻两个元素 (a1 , b1 ), (a2 , b2 )。


那么收入为 b1 ∗ E + b2 ∗ (E + a1 ) 与 b2 ∗ E + b1 ∗ (E + a2 )。
于是按 ai /bi 从大到小排序。
能力值增加 a 的的贡献为 a 乘上之后所有 bi 的和。
枚举一半的任务的 bi 的和。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

令 dpi,j,k 表示考虑了前 i 个任务,前一半放了 j 个,前一半的


b 的和为 k 能获得的最大金额。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
solution

令 dpi,j,k 表示考虑了前 i 个任务,前一半放了 j 个,前一半的


b 的和为 k 能获得的最大金额。
考虑这个当前任务放前一半还是后一半进行转移。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
TaroCutting

你有 n 棵树,第 i 棵树高度为 hi ,第 i 棵树每天增加 ai 。


你要用 m 个设备去砍树,第 i 个设备能把超过 di 的树看成 di 。
每一天,你能选择一些树然后砍它。
每个数每天能被砍一次,每个设备每天能被用一次。
问 T 天之后树的高度最小的总和。
n, m, T ≤ 150。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心
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,然后最大的代价。

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
杜瑜皓
贪心

You might also like