贪心算法
贪心算法有两种证明方法:
-
反证法 :交换项目中任意两个或者相邻两个元素,答案不会变的更好,则目前是最优解。
-
归纳法:
-
排序解法:用排序法常见的情况是输入一个包含几个权值的数组,通过排序然后遍历模拟计算的方法求出最优值。
-
后悔解法:思路是无论当前的选项是否最优都接受,然后进行比较,如果选择之后不是最优了,则反悔,舍弃掉这个选项;否则,正式接受。如此往复
区间调度问题
-
选择最早结束时间 ,或者最晚开始时间
-
从左向右选,一开始的选择范围是,是(-∞,+∞),每选择一个区间后就变成了[Fi ,+∞),让这个范围尽可能越大越好,所以每次要选结束时间最早的,这样选完之后剩下的范围最大
工作调度
国王游戏
- 设大臣i 和大臣i+1 分到的金币分别是 s / b i ( s ∗ a i ) / b i + 1 s/b_i \quad (s*a_i)/b_{i+1} s/bi(s∗ai)/bi+1 ,如果交换大臣i 和大臣 i+1的位置,对其他大臣获得的金币并没有影响。
- 对于两个大臣,考虑是否要交换两个人的位置,如果要交换两个人的位置,
m
a
x
(
s
b
i
,
s
∗
a
i
b
i
+
1
)
max(\frac{s}{b_i},\frac{s*a_i}{b_{i+1}})
max(bis,bi+1s∗ai) 交换后的值
m
a
x
(
s
b
i
+
1
,
s
∗
a
i
+
1
b
i
)
max(\frac{s}{b_i+1},\frac{s*a_{i+1}}{b_{i}})
max(bi+1s,bis∗ai+1)
即 求 m a x ( b i + 1 , a i ∗ b i ) 和 m a x ( b i , a i + 1 ∗ b i + 1 ) max(b_{i+1},a_i*b_i) 和 max(b_i,a_{i+1}*b_{i+1}) max(bi+1,ai∗bi)和max(bi,ai+1∗bi+1),判断是否可以交换。
直接用这个条件进行快排。
摆放垃圾桶
- 可以用树状数组用来统计,某一路段已经放了多少垃圾桶
- 在处理左侧段时,垃圾桶尽可能往右放,我们按照 右端从小到大的顺序处理。
AC
看电影
AC
johnson 法则
问题描述
n个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi。流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。
直接上链接:
https://www.cnblogs.com/fashpoint/p/11309412.html
结论: 若 i 在j 前面比较优, 则 min(bj,ai) <= min(bi,aj)
划分石头
二分答案,
考虑一下,如果限制每段石头和小于 w, 如果w太大,能分的段限制少,可以有更少的段,如果w太小,那么只能更多的段,切要求和最小。
我们二分 w ,寻找能满足 m段的最小值。
捡贝壳
二分答案,体积尽可能大
使用前缀和,来求解平均体积满足要求 W 的段是否存在。
vi, vi+1,…,vj 的平均体积 (vj+…+vi)/(j-i+1) > W
vi - w + vi+1 - w + vi+2 -w + … + vj - w > 0
如果前缀和为 a[i] = a[i-1] + v[i] - w
则,vi - w + vi+1 - w + vi+2 -w + … + vj - w = a[j] - a[i-1]
因此,如果有 aj - ai > 0 ,j - i >= m ,则证明隔了至少m个元素,平均体积满足要求。
难点:前缀和数组不好构造
因此,如果有 aj - ai > 0 ,j - i >= m ,则证明隔了至少m个元素,平均体积满足要求。
难点:前缀和数组不好构造