贪心总结
每次都选当下的最优解,一步步得到全局的最优。
菜就多练
方法
邻项交换法
反悔贪心
拟阵
典中典
邻项交换例子
恰逢 H 国国庆,国王邀请
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
Sol:
设排序后第
那么第
若交换第
交换前更优当且仅当:
都约去
这个已经可以做了,但还可以注意到
拓展
一道推式子以及更严谨地考虑贪心策略的好题。
皇后有
形式化地讲:我们设第
当然,吝啬的皇后并不希望太多的奖金被发给大臣,所以她想请你来重新安排一下队伍的顺序,使得获得奖金最多的大臣,所获奖金数目尽可能的少。
注意:重新安排队伍并不意味着一定要打乱顺序,我们允许不改变任何一位大臣的位置。
Sol:
显然地,获得奖金最多的大臣是排在最后的那一个。
考虑相邻的两个大臣
设这两个大臣之前所有大臣左手上的数字之和为
-
当
排在 前面时,二者中靠后那人获得的奖金为 ,记为 式。 -
当
排在 前面时,二者中靠后那人获得的奖金为 ,记为 式。
根据加法对
设
那么
假设
注意到
充分性已经证明,那么就可以消去
还是通过加法对
再化简,
即
我们已经得到了排序的条件,但是这就够了吗?
不够。在C++中重载的运算符/比较规则要满足严格弱序(概念讲解在下方)。
小于等于号
如果换成
考虑构造另一种排序的比较规则使之满足严格弱序。
当
得到了两种可行的排序方式,取其一便可:
对于本题而言,还有另一种神秘而不自然可行的排序方式:
令
我们将
经验证
反悔贪心例子
约翰有太多的工作要做。为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间。 他的工作日从
Sol:
不想推式子,那就直接反悔做。
按截止时间排序依次考虑,如果当前任务在它的截止时间内还可以做,那就去做。如果不可以做了,那就尝试用它替换已经做了的任务中利润最小的一个。这就做完了。
选择不相交区间
给出
Sol:
按右端点升序排序。依次选即可。
正确性证明:
两个区间相交时,选右端点小的对后面的选择影响更小。
区间选点问题
给出
Sol:
按
从前往后依次考虑每个区间,若当前区间内没点,就选它的右端点
正确性证明:
按右端点递增排序后,若当前区间与后面的区间没有交点,那么随便选点都可以。若当前区间与后面的区间有交点,那么选右端点可以满足更多的区间。
改:
第
Sol:
每个区间从右往左依次取点直到满足即可。
区间覆盖问题
给出
Sol:
将区间按左端点递增排序,依次处理。
每次从覆盖了
正确性证明:
每次选右端点最大的是为了让剩余待覆盖的区间尽量小。
注意判断无解:某一步中没有覆盖了
双机流水作业调度问题
现在有
Another Question:
多机流水作业调度问题,将两个机器改为
Sol:
首先要注意到一个显然的性质:两台机器加工作业的顺序应该是相同的。
证明:
假设在
另一个显然的性质:
定义
这个式子与皇后游戏的式子是完全相同的,故结论相同。详见上文。
这告诉我们,模型的运用可以是类似的情景,也可以是式子的结论。
带期限和罚款的单位时间任务调度
有
Sol:
要使总罚款最少,就要优先完成
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】