首页 > 其他分享 >反悔贪心

反悔贪心

时间:2022-12-08 22:15:44浏览次数:49  
标签:dots log 反悔 删去 最优 贪心

贪心是一种常用的算法,它能够获得局部最优解,但我们往往需要的是全局最优解,所以我们在贪心的时候加入和反悔的机制,让他能够得到全局最优解。
由于网络流中的退流操作本质上也是反悔贪心,所以在实现反悔贪心时类似费用流的,也会被成为模拟费用流。
一般的实现时在贪心之后加入一个和贪心值相反的值或重构问题使得变成原问题等方式实现。

CF865D Buy Low Sell High

这个问题也叫老鼠进洞问题。
我们考虑到达第 \(i\) 天的时候,我们找到前面几天中最小的买入价格 \(a_j\) ,它会对答案做出 \(a_i-a_j\) 的贡献。
但由于一天只能买入一张或者卖出一张,在类似 1 2 100 的结构中贪心就时错误的。
不难发现,如果 \(i\) 会选定 \(j\) 和它做贡献,则在全局最优解中, \(a_j\) 也一定会做贡献。
令 \(a_j\) 与 \(a_k\) 做出 \(a_k-a_j\) 的贡献( \(j<i<k\) ) 。由于 \(a_k-a_j=a_k-a_i+a_i-a_j\) 。
右式的后两项就是我们贪心的结果,这也就意味着,如果我们再在后面贪心的取一次 \(a_k-a_i\) 即可。
题目有每个数只能买入或卖出一次的限制,所以我们只要在贪心取数的时候额外加入一个 \(a_i\) 即可。
使用小根堆维护最优解,最终复杂度为 \(O(n\log n)\) 。

Luogu P1484 种树

因为不能选择相邻的数,所以在取了最大值 \(a_i\) 的时候, \(a_{i+1}\) 和 \(a_{i-1}\) 就不能选了,但可能全局最优解应该是 \(a_{i+1}+a_{i-1}\) 的。
例如在 \(n=5,k=2\) 时,数据 1 99 100 99 1 可以卡掉纯贪心。
考虑 \(a_{i+1}+a_{i-1}=a_{i}+(a_{i+1}+a_{i-1}-a_{i})\) ,比我们的贪心值多了一个 \(a_{i+1}+a_{i-1}-a_{i}\) 。
但它同时也去多取了一个数,所以考虑 \(a_{i-1} a_i a_{i+1}\) 三个数在取了 \(a_i\) 后替换成 \(a_{i+1}+a_{i-1}-a_{i}\) 这一个数。
发现这样不影响限制,维护双线链表和大根堆即可。

集训队互测 Round1 Astra 1 Birth

不难证明最优答案必然把答案划分成若干个连续的 \(00\dots0\) 或 \(11\dots1\) 。
在分割段数减少的时候,我们需要删去一些连续段来使得损失最小。
我们会发现三个性质:

  1. 删去边上的串可以减少一次分割,删去中间的串可以减少一次分割。
  2. 删去相邻的两端一定不优。
  3. 可以保留一个形如 \(0\dots 01\dots 1\) 的结构。

所以我们需要求的就是看有多少个不相邻的连续段在最终答案中不做贡献,先枚举两端的段取不取,在考虑中间的。
这就变成了类似上一题的做法,负责都为 \(O(n\log n)\) 。
在段数小于 \(3\) 的时候不一定有 \(0\dots 01\dots 1\) 结构,所以需要特判,可以在 \(O(n)\) 的复杂度完成。

CF280D k-Maximum Subsequence Sum

比较经典的 GSS 问题,每次找到区间最大的子段,其对答案做出贡献,然后将区间内的所有值取反。
用线段树维护区间和\最大前缀\最大后缀\最大子区间,复杂度为 \(O(n\log n+m\log n)\) 。

标签:dots,log,反悔,删去,最优,贪心
From: https://www.cnblogs.com/Xun-Xiaoyao/p/16967525.html

相关文章

  • CF723F st-Spanning Tree - 贪心 - 图论 -
    题目链接:https://codeforces.com/problemset/problem/723/F题解:首先先删去s和t,原图一定是若干个连通块,先把这些块的生成森林求出来,之后将连通块缩点然后考虑如何与s......
  • CF799E Aquarium Decoration - 贪心 - 堆 -
    题目链接:https://codeforces.com/contest/799/problem/E题解:考虑枚举都喜欢的个数\(s\),那么只有A喜欢的有\(k-s\)个,B喜欢的\(k-s\)个然后我只需要找所有的\(x\)......
  • 树上染色-题解(贪心+DP+二分)
    树的上色题意简述树上有两个黑点,在每个单位时间内,每个黑点可以把自己相邻的一个白点变为黑色,求把整棵树所有点变为黑色的最短时间。\(n\)个点,两个黑点分别为\(x,y\)。......
  • 反悔贪心乱做
    解决历史遗留问题.jpg[APIO/CTSC2007]数据备份显然,选的一定是相邻的两个城市。所以问题转化成,给一个差分数组,选\(k\)个不相邻的数,使得和最小。这就是经典的种树的问......
  • 反悔贪心总结
    综合题:AGC018CCoins大致可以分为两种类型,即要求全选或者有的可以不选。第一类:要求全选问题简述:给定\(x+y\)个物品,每个物品有\(a_i\),\(b_i\)两种属性,要求取......
  • 代码随想录训练营第五十天 | 贪心算法
    今天是第五十天,还有十天一刷就结束了,今天继续是动态规划 123.买卖股票的最佳时机III classSolution{publicintmaxProfit(int[]prices){intn......
  • 常用代码模板6——贪心
    贪心夹逼定理(若a>=b,b>=a,则a==b)证明用当前方法得到的结果就等于最优解区间问题可以尝试的突破口:排序(按左端点或右端点或双关键字排序)常用证明方法:基本......
  • 贪心算法篇——经典题型
    贪心算法篇——经典题型本次我们介绍贪心算法篇的经典题型,我们会从下面几个角度来介绍:Huffman树排序不等式绝对值不等式推公式Huffman树我们直接给出对应题型:/*......
  • 贪心算法篇——区间问题
    贪心算法篇——区间问题本次我们介绍贪心算法篇的区间问题,我们会从下面几个角度来介绍:区间选点区间分组区间覆盖区间选点我们首先来介绍第一道题目:/*题目名称*/......
  • [DP/贪心 时间] P1717 钓鱼
    [DP时间]P1717钓鱼​​题目链接​​题目思路贪心可以做的比较简单,不过这里打算练习一下DP写法为了简化计算,把5分钟设为单位时间状态表示表示走到第i个湖钓鱼,耗时j属性:ma......