关于反悔贪心一些题的大概思路

反悔贪心是一种贪心的改进,如果后面你后悔了还可以撤销以前的操作。所以叫反悔贪心。
后面有几道例题,就用这些题来了解反悔贪心算法。
P2949
可以将所有工作按照 deadline
首先能选的肯定选对吧,因为这样你的收益就会变多。然后选到后面你会发现你的总的工作时间已经大于了这个工作的 deadline,因为每一项工作只需
我们可以用小根堆来维护之前做的工作的利润。
你扫到这个工作并且可以做这项工作时,那就选,这肯定是好的。然后把利润
push
到堆里。否则你扫到这个工作并且你现在的工作总时间已经大于这个工作的 deadline 时,如果这个工作的利润大于堆顶的利润,那么就把总收益减去堆顶然后再加上现在这个工作的利润。
pop
堆顶,并把这个工作的利润push
到堆里。
最后输出总收益即可
P4053
这道题也用与上一道题类似的思想:
按照报废时间给这些建筑排序,然后再从左往右扫。
建立一个大根堆,维护之前已经修理完毕的建筑的修理时间。
- 如果这个建筑你能修,那么就修,这肯定是好的。把修理时间
push
到堆里,然后答案。 - 如果这个建筑你不能修,那么如果他的修理时间小于堆顶的修理时间,那么就说明可以用这个建筑来替换之前的一个不优的建筑。答案不变但是可以缩短修理时间。可以证明舍弃堆顶优化是最大的,这也是好的。把总修理时间减去堆顶再加上现在的建筑的修理时间,
pop
堆顶,再将这个修理时间push
到堆里面。
P2107
看清楚题面!!!你有
这道题的思路也是反悔贪心,和前面的相似。维护一个大根堆,先把所有的点按照坐标排序,然后从左往右贪心:
- 如果算到这个机房 AK 了之后还有剩余时间,那么就将答案
,然后将在这个机房的思考时间 push
进大根堆里。 - 否则如果没有时间,那么可以优化,选择之前选过的解决时间最多的机房(在大根堆里),然后一直舍弃这些机房,直到总时间小于 m。就可以优化时间。
但是你在第二个操作了之后会很明显的感觉到有些情况答案会变小。所以我们要新增一个总答案
P1484
首先想朴素 DP 做法:
设
那么 DP式就是:
max 里的第一项就是不选
时间复杂度
考虑优化。
你第一眼看到这题肯定会想到贪心,然后手玩了一下发现是假的。因为题目中要求不能让这两棵树相邻。
现在我们该考虑的是怎么把这个假的贪心变成真的。
你回到原本的那个贪心。如果你想选这个点,那么你旁边的那两个点就不能选。如果你选到一半,然后又后悔了,又想选那两个点,那又该怎么办?
我们可以想到一个 trick:如果你选了这个点
但是要注意:如果你选了这个点,那你左右两边的点就不能选。我们可以记一个数组
:就是点 删了之后,他的左边相邻的点就更新为原来点 的左边相邻的点。 :同理。只是方向更改了。 :把 删了之后,原来 的左边相邻的点的右边相邻的点就又变回了 ,因为 没了。 :同理。只是方向更改了。
我们把所有选的点的值和编号 push
进一个大根堆里,想选的时候就选堆头。然后再 push
一个处理了之后的点进去。如果已经选了
P1792
思路和上一道题一模一样,但是需要改一个地方:
P3620
题目要求有
我们转化一下题意,把每两个点之间的距离抽象成一个点,这样就有了
有
发现了什么,这个跟上面的两道题都很像!
于是就用上面两道题的思路来做。但是因为和上面的不一样,是求最小值。所以我们要设第
- Title: 关于反悔贪心一些题的大概思路
- Author: 11490DX
- Created at : 2024-11-09 10:23:30
- Updated at : 2025-03-21 11:22:52
- Link: https://11490dx.net/2024/11/09/greedy-ext1/
- License: This work is licensed under CC BY-NC-SA 4.0.