学习笔记—反悔贪心
djy 的《浅谈反悔贪心》,这里做的题都来自反悔贪心题单。
:以前写的太乱了,重构了文章。
反悔贪心
反悔贪心类似 DP,每天我们都可以进行一定操作使得当天我们的收益达到最大值,但是这样的操作可能会使得后面几天达不到最优,这就迫使我们放弃前面的决策。
我们将放弃前面的决策称为反悔,做出新的决策称为贪心,我们需要做的就是在所有决策中选择最优的那个。
例题
CF865D Buy Low Sell High
已知接下来 天的股票价格,每天你可以买进一股股票,卖出一股股票,或者什么也不做。 天之后你拥有的股票应为 ,当然,希望这 天内能够赚足够多的钱。
考虑一次股票交易的过程,一天内买入一次再卖出一次等同于什么也没发生,于是我们考虑一个贪心,每次让之前最小的那个和当前这个配对。
但是这样是错误的,可能将一个较小的日子留给后面的更优,所以我们需要反悔的操作,让后面的将这一天的决策抵消掉。
设第 天的交易价格为 ,则在 之间的 一次交易收益就是 。
如果我们已经在 时将 与 匹配了,我们已经得到了 的贡献,现在我们需要将另外的贡献补上:。
这样我们只用在这一天交易结束后将这天的卖出价格加入堆中即可。
P2107 小Z的AK计划 & P4053 [JSOI2007]建筑抢修
在一条数轴上有 个点,初始在 位置。每向正方向走一步都消耗 单位的时间,每到达一个点可以花费 的时间 获得 的收益,也可以直接路过。
在 的时间内,最大收益是多少?
。
从前往后枚举我们走到哪里,将新的点加入决策。
什么时候需要反悔?当已经消耗了 的时间。选择消耗时间最大的删去即可。
P3620 [APIO/CTSC 2007] 数据备份
一个环(链)上有 个元素,要求选取的任意两个元素互不相邻,求选出 个元素分别可以获得的最大价值是多少。
每次都要新选择一个点,我们有两种操作:
- 加入一个独立的点。
- 将与一些点相邻的点同时取反。
只用一个链表,加入一个点后将 替换为这个点的权值即可,用堆每次选择最大值即可。
CF730I Olympiad in Programming and Sports
有 个人,第 个人有属性 ,要求选出 集合至多 人, 集合至多 人,使得选出的人相应属性值之和最大。
先选出 最大的 个加入 集合,之后一个一个加上 集合,我们每次有以下两种操作:
- 直接加入一个 。
- 将一个人由 转为 ,再选择一个 。
用三个堆对上面信息分别维护即可!
:网络流做法:
- 源点 到每个点建一条流量为 ,费用为 的边(每个人只能只能参加一种比赛)。
- 建三个汇点,汇点 控制参加编程的,汇点 控制参加体育的,汇点 控制参加 和 的总人数。
- 每个人两种实力分别向 , 建流量为 ,费用为负实力。
然后就跑最小费用最大流啦!
AT2672 [AGC018C] Coins
有 个人,第 个人有属性 ,要求选出 集合分别 个人,保证 ,使得选出的人相应属性值之和最大。
一种比较显然的想法是将将 赋为 , 赋为 ,就转化为了上一个问题。
:有一种可以推广到 中限制的做法:
发现每次操作我们只有以下几种方案:
用六个堆维护即可。
CF802O April Fools' Problem medium & hard
每天可以花费 准备一题,花费 打印一题,每天最多准备一题打印一题,求打印 题的最小花费。
如果没有 的限制,那可以将准备看作买入一只股票,打印看作反向卖出一只股票,转化为第一题的套路。
考虑如何限制 只股票。如果我们将每次买卖的收益同时增加一个 ,买卖的优劣性相对不变,但我们会在原来的基础上多进行一些交易。那么我们二分这个 直到正好购买 次股票即可。
CF436E Cardboard Box
个关卡,对每个关卡,你可以花 代价得到一颗星,也可以花 代价得到两颗星,也可以不玩。问获得 颗星最少需要多少时间。
我们进行 次操作,使我们多选择一棵星星,有以下几种方法:
- 直接选择一颗星星;
- 将一颗星星变为两颗;
- 将一颗星星由一颗反悔为不选择,再选择两颗;
- 将两颗星星反悔为一颗,再选择两颗。
那么我们需要维护 五个堆。
P5470 [NOI2019] 序列
给定长度为 的数组 ,要求在他们中分别取恰好 个值,且相同下标且 中都选取的对数 ,求最大选择价值之和。
。
先在两个数组中选择最大的 个,如果相同位置的不到 ,考虑依次增加。想要增加一个相同位置,有以下四种方案:
- 将一个单独选择的 变成一个已经选择 但没有选择 的;
- 将一个单独选择的 变成一个已经选择 但没有选择 的;
- 将一个单独选择的 和一个单独选择的 都删去,变成一个没有选择的 对;
- 将一个已经选择的 拆掉,和一个单独选择的 、单独选择的 分别合并变成两个 对。
用 个堆分别维护上面的选择情况,取最大值转移即可。
(乱入)贪心杂题
P2512 [HAOI2008]糖果传递
有 个小朋友坐成一圈,每人有 个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为 。问最后所有人糖果数量均衡后的最小代价。
如果题目只是在链上,就变成了均分纸牌的问题,假设每个人现有纸牌数为 ,平均为 , 前缀和为 ,则答案为 。
回到这道题上,发现最优解一定存在环上两个人之间不存在糖果传递,可以想到断环成链。
如果断掉环上第 条边,则贡献依次为 。
这就是“仓库选址”问题啦!直接将 定位所有 的中位数,求出答案即可。
P8272 [USACO22OPEN] Apple Catching G
假设在 点有奶牛,在 有苹果 , 可以借助 的充要条件为:
第二个式子直接 从小到大的顺序搞定(注意如果值相同 大的优先),这样只要每个数匹配在它之前的点就都是合法的,接下来只用满足第一个式子。
考虑两头奶牛 一起匹配苹果,我们会让 优先匹配苹果中 最小的,把剩下的留给 。
为什么这样是对的呢?
显然 越小越难被匹配,那么如果可以被匹配,直接匹配一定最优。
而且如果 与 都能够匹配同一个 ,让他们任何一个去匹配是相同的。
那么就这样被简单地证明了。
实际操作中可以用 multiset
来支持查询比 大的数即可。
P2672 [NOIP2015 普及组] 推销员
发现答案只可能是一下两种情况:
-
选择最大的 个推销疲劳值。
-
选择最大的 个推销疲劳值,并选择一个距离较远的。
至于为什么只选择 个而不是 或更少:
加入我们要将第 大的换为更远的,完全可以用第 大的而不是 ,显然这样减小的更少呀。
商店zr
有一个商店,每个天会进货固定 中物品分别 个,每个单价为 ,若 表示有无限个。
在接下来的 天内,每天顾客会来购买最便宜的 个物品,问最终商店收益为多少。
,保证存在至少一个 。
考虑这本质是一个贪心过程,每个月丢给你一堆物品,一定先选择小的并有库存的,没了再选择大的。
这样我们的讨论就不能够脱离贪心的特点,固定了向优化贪心的方向走。
:单位价值下降的天一定放在一起考虑!!!最后剩下单位价值单调不增的一些连通块,将他们合在一起考虑。
本文作者:EricQian06
本文链接:https://www.cnblogs.com/EricQian/p/15568656.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步