贪心
329 字
2 分钟
贪心
贪心:排序推公式
- 思路
- 猜一个排序依据(比如按重量、按 deadline、按权值差等)
- 任取相邻两项 i, j 假设顺序错了,写出交换前/后只与这两头有关的代价/收益表达式
- 令“交换后更优”得不等式,化简成key(i) < key(j) 或 key(i) > key(j)这个 key 就是 sort 的排序键
- 全局按 key 排一遍序即可,Greedy 正确性由“相邻交换不影响其余部分”保证
- 经典例题
| 题目 | 相邻交换不等式 | 排序键 | 备注 |
|---|---|---|---|
| 奶牛玩杂技 | (W+wi)−sj < (W+wj)−si | i+si < wj+sj 即 wi−si < wj−sj | 按 wi+si 升序排,最小化最大压扁值 |
| 排队接水 | i 在前 j 在后总等待 < j 在前 i 在后总等待 | ti < tj | 按时间升序,最小化总等待时间 |
| 活动安排 | 结束早的先选 | end<endj | 按结束时间升序,最大化场次 |
- 模板代码(奶牛玩杂技)
struct Cow { int w, s; };bool cmp(const Cow& a, const Cow& b) { return (a.w + a.s) < (b.w + b.s); // 推出来的排序键}sort(cows, cows + n, cmp);- 注意
- 能否只比较相邻两项?
- 交换后其余部分代价是否不变
- 不等式能否化简成只与单项数据有关的键?
- 直接sort一遍得到全局最优
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
算法错题本
算法在一个圆形操场的四周摆放 $N$ 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的 $2$ 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
2
数论
算法如果 $a$ 除以 $b$ 没有余数,那么 $a$ 就是 $b$ 的倍数,$b$ 就是 $a$ 的约数,记作 $b \mid a$。 约数,也称因数。
3
高精度
算法当数据的值特别大,超出各种基本数据类型的存储范围时,需要使用高精度算法来计算加减乘除。
4
分治
算法问题一分为二 —递归(DFS)-合并答案 时间优化:O(nn)-O(n log n)
5
二分
算法解集具“二段性”即可用:前一段不满足,后一段一定满足,或反之
随机文章随机推荐

