贪心
贪心总结
1.调换决策顺序,列出不等式,获得贪心方法
2.对于一个决策顺序,看看是否需要反悔贪心
3.如果不知道如何贪心,可以随便定一个贪心方法,然后思考其错误性,并进行调整
4.对于已经确定的决策顺序但不知道每个点是否决策,可以使用01背包dp进行决策。
5.可以先想一下特殊情况(不一定是部分分)的贪心策略,然后再打补丁
6.若使用邻项交换法证明贪心,可以使用必要性成立的结论。(例如:\(max(a,c)<max(b,c)\)是\(a<b\)的必要不充分条件)
7.对于不满足传递性(无法表示成一个元素的属性与另一个元素的同种属性比较)的排序标准,可以归纳一下每个元素的性质,然后先对该性质进行排序,再对性质相同的元素进行排序(分类讨论)
8.若无形式化贡献,尽量转换成形式化贡献,便于列不等式
例题
1.P4823[TJOI2013]拯救小矮人(O(nlogn)一贪到底做法)
考虑到可不可以确定一个顺序,使得每个小矮人按一个顺序出去。
假设若小矮人i在小矮人j之前出去,则若调换,如果贪心为正确,则小矮人j能出去,但小矮人i不能够出去。
设未出去的小矮人的身高和(不包括小矮人i和小矮人j)为h,则写下关系式即为\(h+A_{i}+B_{i}<H<=h+A_{j}+B_{j}\)。
整理一下可得\(A_{i}+B_{i}<A_{j}+B_{j}\)。
所以可以把所有小矮人按照\(A_{i}+B_{i}\)升序排序,出去的顺序即为排完序后的顺序。
接下来考虑若一个人无法出去,把已经出去的人拉回来让当前人出去是否更优。(因为上面的贪心方法未考虑不出去的情况)
显然如果想要更优,只能拉回来一个人,所以显然拉回来身高最高的人更优。
所以若 把出去的人中身高最高的拉回,当前人能够出去,则执行此操作;否则就让当前人不出去。
2.P1650 田忌赛马
初步思路:
将田忌的马和齐王的马都从大到小排序,然后双指针比较,若能打过,则打,不能打过,则拿最小的马跟齐王最大的马换了。
错误性:
考虑到处理齐王最小的几只马的时候,使用了速度很快的马比过,而导致换齐王大马的时候很难平手。
正确思路:
将田忌的马和齐王的马都从大到小排序,然后四指针比较,若田忌的快马能打过齐王的快马,则打,直到打不过为止;若田忌的慢马能打过齐王的慢马,则打,直到打不过为止;然后用最慢的马把齐王最大的马换了。如此反复。
3.P5749 [IOI 2019] 排列鞋子
对于求调换次数,显然能够想到逆序对,所以只需要定义出 初始的序列,求出最终的序列即可。
那么有一个显然的贪心,就是从左到右,对于每一个没被匹配过的鞋子,向右边找到一个离它最近的未被匹配的鞋子即可,令负数为i,令正数为i+1即可。
这样就定义出了初始序列,最终序列显然为1~2*n。
对于正确性的证明:
1.对于每个鞋子,一定选择离它最近的鞋子进行匹配。
证明:设当前鞋子位置为x,离当前鞋子最近的能与其匹配的鞋子的位置为y,离当前鞋子次近的能与其匹配的鞋子的位置为b,理论上能与位置为b的鞋子匹配的鞋子为a。
根据定义,有不等式x<y<b,a<b。
则比较y-x+b-a与b-x+|y-a|即可
显然y-x+b-a<=b-x+|y-a|
所以结论成立
2.对于每对鞋子,初始的序列赋值一定是从小到大
证明:设当前鞋子(钦定其为左脚)的初始编号为a,与其匹配的鞋子的初始编号为b,另一只鞋子(钦定其为左脚,且在a的右边)的初始编号为c,与其匹配的鞋子的初始编号为d。
根据定义,有不等式a<b,a<c<d。
只需要比较b-a+d-c与c-a+d-b即可。
显然b-a+d-c<=c-a+d-b
所以结论成立
4.AT_hitachi2020_d Manga Market
考虑能否确定商店购买的顺序关系。
设先选i再选j的时间<=T+0.5且先选j再选i的时间>T+0.5
设x表示走完除了i,j的商店的时间,得出不等式
\(x+1+a_{i}(x+1)+b_{i}+1+a_{j}(x+1+a_{i}(x+1)+b_{i}+1)+b_{j}<x+1+a_{j}(x+1)+b_{j}+1+a_{i}(x+1+a_{j}(x+1)+b_{j}+1)+b_{i}\)
整理可得\(a_{j}b_{i}+a_{j}<a_{i}b_{j}+a_{i}\)
将所有商店按这个标准排序,然后就可以贪心选择了。
设\(f_{i,j}\)表示枚举到第i个商店,已经买了j个商店的最小时间。转移显然为\(f_{i,j}=min(f_{i-1,j},(f_{i-1,j-1}+1)*(a_{i}+1)+b_{i})\)
考虑优化,因为状态数是\(O(n^2)\)的,所以考虑优化状态,发现如果\(a>=1\),买了\(logT\)个商店后一定会超过T,所以\(j<=logT\)。
对于\(a=0\),则显然从\(b\)小的往大的贪。
然后考虑对以上两种情况进行整合,因为\(a=0\)这种情况对于每个商店的贡献与时间无关,所以后选显然更优,所以先dp求出\(a>=1\)的情况,再贪心选择\(a=0\)的情况即可。
5.P4409 [ZJOI2006] 皇帝的烦恼
假设为一条链,则\(ans=max_{i=1}^{n-1}a_{i}+a_{i+1}\),假设变成一个环,则不合法的情况为 出现 一种勋章放置次数>\(\lfloor\frac{n}{2}\rfloor\),所以需要与\(\lceil\frac{\sum_{i=1}^{n}a_{i}}{\lfloor\frac{n}{2}\rfloor}\rceil\)取max。
6.P2123 皇后游戏
观察题面可得c是单调递增的,所以\(c_{n}\)一定是所有c中最大的,所以只需要让\(c_{n}\)最小即可
考虑贪心确定大臣的顺序,若想要使i号大臣在i+1号大臣的左边,必须满足:
整理可得:
两边的\(c_{i-1}+b_{i}+b_{i+1}\)可以同时省去,因为\(max(a,c)<max(b,c)\)是\(a<b\)的必要不充分条件,所以如果满足a<b,则一定满足max(a,c)<max(b,c)。
所以变为:
把同项提出并约掉得:
发现左右相同项可以放到一起,整理后得:
观察此式子,观察不等号左侧,发现它等于两个数中较小数的相反数,右侧同理,变为数学表达式则为:、
把符号约掉后得:
所以理论上来讲把所有的大臣按照这个标准排序即可,但是事实上这个不等式不满足传递性(无法表示成一个元素的属性与另一个元素的同种属性比较),考虑让其具有传递性。
归纳一下每位大臣的性质,观察不等式,发现\(a_{i}<b_{i}\)的大臣显然在前,\(a_{i}==b_{i}\)的大臣在中间,\(a_{i}>b_{i}\)的大臣在最后。
所以只需要考虑对于每种大臣之内该如何排序。
若\(a_{i}<b_{i},a_{i+1}<b_{i+1},\)则令\(a_{i}<a_{i+1}\)可满足上述不等式。
若\(a_{i}==b_{i},a_{i+1}==b_{i+1},\)随意。
若\(a_{i}<b_{i},a_{i+1}<b_{i+1},\)则令\(b_{i}>b_{i+1}\)可满足上述不等式。
这样就可以排序了,然后按照题意模拟求出\(c_{n}\)即为答案。
7.P1561 [USACO12JAN] Mountain Climbing S
考虑需要找到一个上山顺序和一个下山顺序,使得下山时间尽可能占满。
首先一个牛如果到达了山顶,一定不会等待别的牛超过自己,因为贡献显然会多一个等待时间,所以上山顺序和下山顺序相同。
先考虑模拟过程,计\(us_{i}\)表示第i头牛上山后的总上山时间,\(ds_{i}\)表示第i头牛下山后的总下山时间。则显然有转移:
答案显然为\(ds_{n}\),且ds具有单调性
考虑邻项交换,若要使第i头牛在第i+1头牛前,必须满足以下不等式:
将该不等式化成1个max得:
把相同的项消了(能消的原因具体见P2123),得不等式:
把同项提出并消掉后得:
移项后得:
然后就可以表示成(具体原因见P2123):
去掉负号后得:
此排序标准没有传递性,所以进行转化,具体同P2123
浙公网安备 33010602011771号