区间问题
在当前选择局部最优解,依次这样选择能够到达全局最优解。
区间选点
- 1、将每个区间按右端点从小到大排序;
- 2、从前往后依次枚举每个区间,如果当前区间已经包含点,则pass;否则选择当前区间的右端点。
证明:按照上述规则选出来的所有点数记为cnt
,题目要求为ans
,则ans<=cnt
,cnt
同时代表了我们目前有cnt
个区间,因此ans
最少需要cnt
个点,因此ans>=cnt
,因此上述cnt
便是解。
1 |
|
最大不相交区间数量
按照区间的右端点排序,因为我们要选择不相交区间,那么右端点最小的区间是最贪心的选择,这下选择合并其他区间时,其他区间的左边可以更靠左,也就是选择范围更广。
1 |
|
区间分组
- 1、将所有区间按左端点从小到大排序;
- 2、从前往后处理每个区间,判断能否将其放到某个现有的组中;即
L(i) > Max_r
,不能的话,意味着当前组与当前区间有交集,重新开一个组放入当前区间;能的话,将当前区间放入组内,更新Max_r
。
1 |
|
区间覆盖
1、将所有区间按照左端点从小到大排序;
2、从前往后依次枚举每个区间,在所有能覆盖目标区间start
的区间中,选择右端点值最靠右(最大)的区间;然后将start
更新成右端点的最大值;
1 |
|
Huffman树
合并果子
在路径上,叶子节点存在多少个父祖节点,就需要计算多少次该叶子节点的值。
1、挑两个权值最小的节点,它们是深度最深且可以互为兄弟(不一定作为兄弟)的节点。
2、贪心式地合并,即n-1
的最优解是否一定是n
的最优解?f(n) = f(n-1) + a + b
,所有最小值都存在a+b
,因此可以去掉a+b
再考虑f(n-1)
.
实现:利用优先队列,只要堆中数目大于1便进行合并;
1 |
|
排序不等式
排队打水
等待的总时间为$t_1 \times(n-1) + t_2 \times (n-2)+….$ ; 即贪心的可知,按照从小到大的顺序排队,总时间最小。
证明:反证法,交换t(i)与t(i+1)
1 |
|
绝对值不等式
货仓选址
每个商店的地址记为$x_i$,货仓地址记为$x$,总的距离为:$f(x)=|x_1 - x| + |x_2 - x| +…|x_n + x|$,
分组的思想:第一个x1和最后一个xn视为一组,即$f(x) =|x_1 - x| + |x_n - x|$,此时,x应该取a与b之间。
因此所有数的个数为奇数,则取中位数;偶数的话则取中间两个数之间, $f(x)$的大小即$|xn - x_1| +|x{n-1} - x_2| + … $。
1 |
|
推公式
耍杂技的牛
目的:最大的危险系数中最小的。
结论:按照 $ w_i + s_i $ 从小到大的顺序排,最大的危险系数一定是最小的。
证明:贪心得到的答案 >= 最优解(min); 需要证明贪心得到的答案<=最优解;
反证:
可知当交换第i
和i+1
位置的牛后,i+1
位置上的牛的风险大于i
位置的牛,并且风险增大了,因此违反了目的,结论成立。
第i个位置上的牛 | 第i+1个位置上的牛 | |
---|---|---|
交换前 | $w1 + w_2 +..+w{i-1} - si= - s_i=> s{i+1}$ | $w1 + w_2 +..+w{i} - s{i+1} =w{i} - s_{i+1}=>w_i + s_i $ |
交换后 | $w1 + w_2 +..+w{i-1} - s{i+1} = - s{i+1}=>s_{i} $ | $w1 + w_2 +..+w{i-1} +w{i+ 1} - s_i = w{i+ 1} - si =>w{i+ 1} + s_{i+1} $ |
1 |
|