贪心

贪心总结

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号大臣的左边,必须满足:

\[max(max(c_{i-1},\sum_{j=1}^{i}a_{j})+b_{i},\sum_{j=1}^{i+1}a_{j})+b_{i+1}<max(max(c_{i-1},\sum_{j=1}^{i-1}a_{j}+a_{i+1})+b_{i+1},\sum_{j=1}^{i+1}a_{j})+b_{i} \]

整理可得:

\[max(c_{i-1}+b_{i}+b_{i+1},\sum_{j=1}^{i}a_{j}+b_{i}+b_{i+1},\sum_{j=1}^{i+1}a_{j}+b_{i+1})<max(c_{i-1}+b_{i+1}+b_{i},\sum_{j=1}^{i-1}a_{j}+a_{i+1}+b_{i+1}+b_{i},\sum_{j=1}^{i+1}a_{j}+b_{i}) \]

两边的\(c_{i-1}+b_{i}+b_{i+1}\)可以同时省去,因为\(max(a,c)<max(b,c)\)\(a<b\)的必要不充分条件,所以如果满足a<b,则一定满足max(a,c)<max(b,c)。

所以变为:

\[max(\sum_{j=1}^{i}a_{j}+b_{i}+b_{i+1},\sum_{j=1}^{i+1}a_{j}+b_{i+1})<max(\sum_{j=1}^{i-1}a_{j}+a_{i+1}+b_{i+1}+b_{i},\sum_{j=1}^{i+1}a_{j}+b_{i}) \]

把同项提出并约掉得:

\[max(b_{i},a_{i+1})+a_{i}+b_{i+1}<max(b_{i+1},a_{i})+b_{i}+a_{i+1} \]

发现左右相同项可以放到一起,整理后得:

\[max(b_{i},a_{i+1})-b_{i}-a_{i+1}<max(b_{i+1},a_{i})-a_{i}-b_{i+1} \]

观察此式子,观察不等号左侧,发现它等于两个数中较小数的相反数,右侧同理,变为数学表达式则为:、

\[-min(b_{i},a_{i+1})<-min(a_{i},b_{i+1}) \]

把符号约掉后得:

\[min(a_{i},b_{i+1})<min(b_{i},a_{i+1}) \]

所以理论上来讲把所有的大臣按照这个标准排序即可,但是事实上这个不等式不满足传递性(无法表示成一个元素的属性与另一个元素的同种属性比较),考虑让其具有传递性。

归纳一下每位大臣的性质,观察不等式,发现\(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头牛下山后的总下山时间。则显然有转移:

\[us_{i}=us_{i-1}+U(i) \]

\[ds_{i}=max(ds_{i-1},us_{i})+D(i) \]

答案显然为\(ds_{n}\),且ds具有单调性

考虑邻项交换,若要使第i头牛在第i+1头牛前,必须满足以下不等式:

\[max(max(ds_{i-1},us_{i-1}+U(i))+D(i),us_{i-1}+U(i)+U(i+1))+D(i+1)<max(max(ds_{i-1},us_{i-1}+U(i+1))+D(i+1),us_{i-1}+U(i)+U(i+1))+D(i) \]

将该不等式化成1个max得:

\[max(ds_{i-1}+D(i)+D(i+1),us_{i-1}+U(i)+D(i)+D(i+1),us_{i-1}+U(i)+U(i+1)+D(i+1))<max(ds_{i-1}+D(i)+D(i+1),us_{i-1}+U(i+1)+D(i)+D(i+1),us_{i-1}+U(i)+U(i+1)+D(i)) \]

把相同的项消了(能消的原因具体见P2123),得不等式:

\[max(us_{i-1}+U(i)+D(i)+D(i+1),us_{i-1}+U(i)+U(i+1)+D(i+1))<max(us_{i-1}+U(i+1)+D(i)+D(i+1),us_{i-1}+U(i)+U(i+1)+D(i)) \]

把同项提出并消掉后得:

\[max(D(i),U(i+1))+U(i)+D(i+1)<max(D(i+1),U(i))+U(i+1)+D(i) \]

移项后得:

\[max(D(i),U(i+1))-U(i+1)-D(i)<max(D(i+1),U(i))-U(i)-D(i+1) \]

然后就可以表示成(具体原因见P2123):

\[-min(D(i),U(i+1))<-min(D(i+1),U(i)) \]

去掉负号后得:

\[min(D(i+1),U(i))<min(D(i),U(i+1)) \]

此排序标准没有传递性,所以进行转化,具体同P2123

posted on 2025-11-16 19:12  jisuheng123  阅读(19)  评论(0)    收藏  举报