蓝桥杯课程-贪心算法讲解
1.区间调度问题
问题描述
在有限的区间范围内,选择完成最多的任务组合
解决策略
我们可以思考的策略有:
1.最早开始时间(begin)
2.最早结束时间(end)
3.用时最少(end - begin)
1.我们这里首先定方向:从区间最左端向右开始选择。
2.我们很容易想到的策略是选择用时最少的情况,但是试想如果有一个短任务刚好卡在两个任务中间,我们还是选择该任务,可能为了这一个任务舍弃了两个任务(证明贪心最优很难,证明非最优举反例即可)
3.其次我们考虑最早开始时间,如果有一个贯穿区间的长任务开始最早,那么是不是就不是最优了,排除
4.考虑最早结束时间,我们可以考虑奖励机制,每次选择一个任务得到的奖励分为:选择这个任务本身 使得结果count++ 与 剩余可选择的区间长度(len) 两个奖励;
我们很容易知道前者无论如何选择,一次选择一个奖励都是一样的; 但是对于后者来说,如果选择最早结束时间,我们剩余可选择的区间长度就会越长,在剩下的区间中选择到更多的任务组合可能性越多,就月可能选择到更优秀的组合,这也就是我们想要的贪心策略。
典型例题
2.区间覆盖问题
问题描述
给定一个区间长度,选择最少的任务覆盖整个区间
解决策略
我们可以思考的策略有:
在任务开始时间早于区间剩余部分的开始时间基础上,选择
1.用时最长(end - begin)的
2.最晚结束时间
1.如果是选择用时最长的情况,有可能存在该任务与已覆盖区间高度重合的情况,导致其实提供的实际奖励(减去的区间剩余部分)实际不多,甚至少于其他组合
2.如果是选择最晚结束的,只要该任务头部能衔接上上一个任务结束位置,最晚结束时间的实际奖励是最多的,剩余的区间长度最短(由于每次我们选择任务是只要该任务开始时间早于上一个任务的结束时间,这里结束越晚,我们可以选择的任务组合越多,就越有可能选择到最优解)
3.最优装载问题
问题描述
药水浓度: (V1 * w1% + V2 * w2% + ...) / (V1 + V2 + ...) <= w%
V1 * w1% + V2 * w2% + ... <= w% * (V1 + V2 + ...)
我们希望(V1 + V2 + ...)越大越好,所以我们发现必然是选择尽可能小的 w_i%,这样就可以获得更大的体积
解决策略
这里如果我们选择使用浓度较大的药水,就会使药水浓度更快达到预定值,导致体积无法达到最优值
4.最优装载问题2
问题描述
注意这里药水可以只取部分!!!
解决策略
5.多机调度问题
问题描述
解决策略
可以考虑以下的贪心策略:
(1)最长处理时间作业优先的贪心选择策略。
(2)最短处理时间作业优先的贪心选择策略。
(3)作业到达时间优先的贪心选择策略。
很明显针对最短处理时间优先,会出现机子执行了长任务额同事,之前还执行过段任务,导致总耗时较长。
至于作业到达时间优先更不能保证重叠区域长度最大。
但是在最长处理时间优先中,我们可在机子处理长任务中让其他空余机子“抽空”处理较短任务,尽量增大重叠区域!!
是的,这题最优解的解题思路就是增加重叠区域的总长度(所有任务总耗时固定,实际耗时 = 总耗时 - 重叠部分(同时进行))
很明显,我们首先选择最长任务之后,其余任务都是短于该任务的,在选择其中最长的,也就是和该任务重叠区域长度最大的任务,
每一步都是增大重叠区域最大的选择(局部最优),达成总时间最短(全局最优,实际耗时 = 总耗时 - 重叠部分(同时进行))