[学习笔记]贪心

贪心是一个考察智商的算法。

也是一个考察猜结论能力,证明能力的算法。

和DP类似,贪心也有一个前提,问题必须有最优子结构。

 

一、经典模型:

①硬币问题:找零钱——贪心

②部分背包:性价比排序

③区间问题
给定 n 个区间,每个区间左右端点分别为 li, ri,现在要求选出尽量多的区间使得它们两两不相交 (不包括端点),问最多能选出几个区间:

按照右端点从小到大排序决策。选择右端点最小的,剩余的空间最大。决策具有包容性。

④顺序问题
给定 n 个数 ai,再给出 n 个数 bi,现在要求你重新排列 b 的顺序,
使得$\sum_{i=1}^n ai\times bi$最小

排序不等式,交换法即可证明。

 

 

二、贪心的一般证明方法,也可以看做是入手的方法:

1.微扰法(临项交换)

一般用于对于若干个数排序,然后找最优解等等。

例题:

之前模型的④顺序问题。排序不等式的证明。

经典地,NOIP2012国王游戏。

还有叠罗汉的问题:Guard Mark

都是交换即可证明排序的条件。

还有分两段甚至更多段交换的:BZOJ 3709&&AGC 018 C——多段排序的微扰法

 

还有从国王游戏衍生的:皇后游戏:luoguP2123 皇后游戏——微扰法的应用与排序传递性的证明

皇后游戏其实是微扰法的究极题目了。

它告诉我们,微扰法的另一个适用条件是排序的大小关系具有传递性。

 

2.范围缩放

3.决策包容性

模型的③区间问题 就是很好的例子。

4.反证法

5.数学归纳法

 

三、还有一些贪心的常用方法:

1.高位贪心:从高位到低位确定,本质是大小比较的本质:先比较高位,再比较低位。

①字典序问题。

②异或问题:给定 n 个数,求选两个数进行异或操作所能得到的最大值。0/1trie上高位贪心即可。

还有一个经典地高位贪心+dp验证题目:CF981D Bookshelves

2.反悔贪心

(名字是我自己起的)

贪心是不能反悔的。因为它就是选择当前的最优解。

但是如果当前最优解不是全局最优解怎么办?

我们可以设计一种反悔的方法,并且和贪心的手法结合。

使得贪心随便选择,都可以达到正解。

反悔自动机与反悔堆——有关贪心的反悔操作

3.树上贪心:

这种贪心往往和子树、儿子的信息联系在一起,有的甚至和树形dp有些类似。但是本质其实是贪心。

例题:[POI2008]MAF-Mafia

2067: [Poi2004]SZN——树上贪心+二分

 

 

其他的贪心:

1.[NOI2017]蔬菜——时光倒流+贪心

posted @ 2018-10-15 22:12  *Miracle*  阅读(495)  评论(0编辑  收藏  举报