贪心总结

每次都选当下的最优解,一步步得到全局的最优。

菜就多练

贪心练习

方法

邻项交换法

反悔贪心

拟阵

典中典

邻项交换例子

luogu国王游戏

恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

Sol:

设排序后第i个大臣左手右手上的数分别为ai,bi,第i个大臣前面所有人左手上的数乘积为s

那么第i个大臣获得的奖赏为sbi,第i+1个大臣获得的奖赏为saibi+1

若交换第ii+1个大臣,那么原来的第i个大臣获得的奖赏为sai+1bi,原来的第i+1个大臣获得的奖赏为sbi+1

交换前更优当且仅当:max(sbi,saibi+1)<max(sai+1bi,sbi+1)

都约去s,并乘上bibi+1max(bi+1,aibi)<max(ai+1bi+1,bi)

这个已经可以做了,但还可以注意到aibi>bi,bi+1<ai+1bi+1,那么不等式等价于aibi<ai+1bi+1,排序即可。

拓展

luogu皇后游戏

一道推式子以及更严谨地考虑贪心策略的好题。

皇后有 n 位大臣,每位大臣的左右手上面分别写上了一个正整数。恰逢国庆节来临,皇后决定为 n 位大臣颁发奖金,其中第 i 位大臣所获得的奖金数目为第 i1 位大臣所获得奖金数目与前 i 位大臣左手上的数的和的较大值再加上第 i 位大臣右手上的数。

形式化地讲:我们设第 i 位大臣左手上的正整数为 ai,右手上的正整数为 bi,则第 i 位大臣获得的奖金数目为 ci 可以表达为:

ci={a1+b1,i=1max{ci1,j=1iaj}+bi,2in

当然,吝啬的皇后并不希望太多的奖金被发给大臣,所以她想请你来重新安排一下队伍的顺序,使得获得奖金最多的大臣,所获奖金数目尽可能的少

注意:重新安排队伍并不意味着一定要打乱顺序,我们允许不改变任何一位大臣的位置。

Sol:

显然地,获得奖金最多的大臣是排在最后的那一个。

考虑相邻的两个大臣i,j,其中j=i+1。交换i,j对前面的大臣没有影响,对后面的大臣影响在于j获得的奖金,要使之尽量小。

设这两个大臣之前所有大臣左手上的数字之和为s,这两个大臣的前面那个大臣获得的奖金为p

  • i排在j前面时,二者中靠后那人获得的奖金为max(max(p,s+ai)+bi,s+ai+aj)+bj,记为1式。

  • j排在i前面时,二者中靠后那人获得的奖金为max(max(p,s+aj)+bj,s+ai+aj)+bi,记为2式。

根据加法对max的分配律,可以对两个式子化简。

1式:max(p+bi+bj,s+ai+bi+bj,s+ai+aj+bj)

2式:max(p+bi+bj,s+aj+bi+bj,s+ai+aj+bi)

A=p+bi+bj,B=max(s+ai+bi+bj,s+ai+aj+bj),C=max(s+aj+bi+bj,s+ai+aj+bi)

那么1式即为max(A,B)2式即为max(A,C)

假设i排在j前不会更差,那么就有max(A,B)max(A,C)

注意到BCmax(A,B)max(A,C)。这可以通过讨论A,B,C三者的大小关系得到。

充分性已经证明,那么就可以消去A。现在要解BCmax(s+ai+bi+bj,s+ai+aj+bj)max(s+aj+bi+bj,s+ai+aj+bi)

还是通过加法对max的分配律得到max(bi,aj)+s+ai+bjmax(bj,ai)+s+aj+bi

再化简,ai+bjmax(ai,bj)aj+bimax(aj,bi)

min(ai,bj)min(aj,bi)

我们已经得到了排序的条件,但是这就够了吗?

不够。在C++中重载的运算符/比较规则要满足严格弱序(概念讲解在下方)。

小于等于号不满足非自反性,这个规则不是严格弱序。

如果换成min(ai,bj)<min(aj,bi),满足传递性但不满足不可比的传递性。

考虑构造另一种排序的比较规则使之满足严格弱序。

min(ai,bj)=min(aj,bi)时,考虑贪心,观察原来结论中的式子min(ai,bj)min(aj,bi),对于i来说,a尽可能小,b尽可能大,上式更可能成立。于是此时将a小的放在前面,或者将b大的放在前面即可。

得到了两种可行的排序方式,取其一便可:

P(i,j)={ai<ajmin(ai,bj)=min(aj,bi)min(ai,bj)<min(aj,bi)Otherwise.

Q(i,j)={bi>bjmin(ai,bj)=min(aj,bi)min(ai,bj)<min(aj,bi)Otherwise.

对于本题而言,还有另一种神秘而不自然可行的排序方式:

di=sgn(aibi),设计排序函数:

F(i,j)={di<djdidjaiajdi=dj0bi>bjdi=dj=1

我们将min(ai,bj)min(aj,bi)拆成逻辑表达式得到:

(aiajbjaj)(aibibjbi)

经验证F(i,j)满足上式,且可以证明其为严格弱序,可以用于C++排序。

反悔贪心例子

luogu Work Scheduling G

约翰有太多的工作要做。为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间。 他的工作日从 0 时刻开始,有 109 个单位时间。在任一时刻,他都可以选择编号 1NN(1N105) 项工作中的任意一项工作来完成。 因为他在每个单位时间里只能做一个工作,而每项工作又有一个截止日期,所以他很难有时间完成所有N个工作,虽然还是有可能。 对于第 i 个工作,有一个截止时间 Di(1Di109),如果他可以完成这个工作,那么他可以获利 Pi(1Pi109). 在给定的工作利润和截止时间下,约翰能够获得的利润最大为多少。

Sol:

不想推式子,那就直接反悔做。

按截止时间排序依次考虑,如果当前任务在它的截止时间内还可以做,那就去做。如果不可以做了,那就尝试用它替换已经做了的任务中利润最小的一个。这就做完了。

选择不相交区间

Question

给出n个开区间(li,ri),选择尽量多个区间使之没有交点。

Sol:

按右端点升序排序。依次选即可。

正确性证明:

两个区间相交时,选右端点小的对后面的选择影响更小。

区间选点问题

Question

给出n个闭区间[li,ri],选尽量少的点使每个区间内都至少有一个点。

Sol:

ri递增,r相同时li递减排序。

从前往后依次考虑每个区间,若当前区间内没点,就选它的右端点r

正确性证明:

按右端点递增排序后,若当前区间与后面的区间没有交点,那么随便选点都可以。若当前区间与后面的区间有交点,那么选右端点可以满足更多的区间。

改:

i个区间要求至少要有ki个点?

Sol:

每个区间从右往左依次取点直到满足即可。

区间覆盖问题

给出n个闭区间[li,ri],选择尽量少的区间覆盖[s,t]

Sol:

将区间按左端点递增排序,依次处理。

每次从覆盖了s的区间中选取右端点最大的一个,并更新s。直到所选择的区间包含了t为止。

正确性证明:

每次选右端点最大的是为了让剩余待覆盖的区间尽量小。

注意判断无解:某一步中没有覆盖了s的区间时无解。

双机流水作业调度问题

Question

现在有n个作业,第i个作业分为两项内容,要按序先后在机器AB上完成,分别需要时间ai,bi。一台机器同一时间只能进行一项作业。求完成所有作业的最短时间。

Another Question:

多机流水作业调度问题,将两个机器改为m个机器。是NP-hard问题。

Sol:

首先要注意到一个显然的性质:两台机器加工作业的顺序应该是相同的。

证明:

假设在Aij先加工,Bji先加工(j=i+1,这里运用邻项交换法。),那么jA上加工完成之前i无法进行在B上的加工,显然不会比交换前更优。

另一个显然的性质:A上时刻都有作业在被加工,而B上不一定。(过于显然,不予证明。)

定义ci表示加工完i个作业的最短用时,可以写出式子:

ci={a1+b1i=1max{ci1,j=1iaj}+bi2in

这个式子与皇后游戏的式子是完全相同的,故结论相同。详见上文。

这告诉我们,模型的运用可以是类似的情景,也可以是式子的结论。

带期限和罚款的单位时间任务调度

Question

n个任务,每个任务有结束期限di和罚款wi,用时为1个单位时间。如果任务无法在结束期限前完成,将导致wi的罚款。现在要使总罚款最小。

Sol:

要使总罚款最少,就要优先完成wi较大的任务。对于每个任务,安排在尽量靠近di的时刻完成以给其他任务让出靠前的时刻。如果一个任务已经无法在结束时限前完成且必须被完成,就安排在尽可能靠近结束的时刻完成,理由同前一条。

posted @   RandomShuffle  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示