思维回想集 - 贪心
作者:互联网
注:未进行二次整理,仅为做题后的直接总结.
本文档旨在对思考方向的总结与例证收集.
@ 贪心
1* 单位最优.
将需求拆成许多'单位需求',再对于每个'单位需求'寻找'单位货物'.
适用范围: 静态 ; 没有组合优惠 ;
例子: (P1208.要采购a份牛奶,每个农民有bi份且单价为ci.最小化花费.)
3* 极端对比,归纳 & 邻项交换 ~约等于~ 与其它情况进行比较
用你的两个点所构成的匹配,替换答案的对应那两个点的匹配(此时答案有4个点,因此你需要将剩下2点匹配起来,即使那并非最优!),目的是证伪答案的最优性--既然答案通过改为你现在的这个匹配可以更优,那么它就不是答案了.--对比
因此你要选择最夸张的匹配,不然答案还会嘴硬.--极端
而且当定下该匹配最优后,应立即删去不再用的点,试图构造与刚刚相似的模型,类似数学归纳法.--归纳
适用范围: 可以邻项交换而不影响其它匹配的计算,则交换.
例子: (P4995.n个正数,第一个位置固定为0,为剩下的位置寻一个排列使得相邻数的差 的平方 加起来最大.)
(P1094.可证明最小的一定匹配符合要求中的最大物品时,不劣于任何答案.)
(P1080.国王游戏,经典的邻项交换 )
(P5521.(类比到化学)(活化能-焓变)最大的步骤先走.)
(P8113.按照当前分数和a1,a2大小关系分类即可.)
-数学归纳法
例子: (P1090.合并果子中,最小的两堆合并好后问题规模-1.)
(P1937.证明后来的与之前已选择的有冲突时,为使得再后来的能更有可能被满足,要舍弃"后来的".)
2* 关键信息排序=主元法
把题目中的关键信息从小到大(或~)排序后按顺序考虑.
假如没有思路,就凭直觉任选一个主元排序吧.
例子: (P1199.将默契值大到小排,第一个含有此前已出现过的武将的匹配为答案.)
(AT4877.将工资大到小排(相等时随便).放在尽可能晚的时间完成.)
(P7831.处理掉-1后,按照边权从大到小排.)
(P3605.从大到小加点.)
3* 思考答案来源 & 考虑特殊位置
找到对答案有帮助的贡献点,然后贪心的选取最大的,由于不能两全其美,因此答案可以由{A类贡献的贪心最优+B类贡献在满足A时的最优,B类贡献的贪心+A类贡献在满足B情况时的最优}得出.
例子: (P2672.A类=a,B类=s,A类的贪心为选择最大的a,B类的贪心为选择最大的a+2s.)
(P2431.特殊位置为a,b二进制分解后从高往低找的第一个不同的位.)
(AT2044.1号点必须连到自己.)
(P3076.每段的st和ed是特殊的,答案要加上的却是ed->st的长度.)
(CF436E.最右边的选b的位置记为特殊位置.)
(P4785.每个位置可选的数是logN级别,所以可以往此方向思考.)
(CF351E.考虑最大值,如果正,后面的所有(除了相等)数都与其构成逆序对;反之前面的~.也算是在"特殊位置"--较大的值时统计逆序对)
(AT2557.都有max,min了,还不考虑最值?)
(P4823.二分答案检验时要么选好最大的a,在其中产生max(b),要么先选最大的a+b,再选前x-1个a(重复则忽略))
(P2652.枚举每个花色后,还要考虑下i->i+1的快速更新方法.)
3* 数学融入证明
(1)max相关:max(max(A,B)+C,D)+E=max(A+C+E,B+C+E,D+E)
(2)比较相关:若max(A,B)<=max(A,C)是真理,那么可用"逻辑式"得出,必有(B<=A或B<=C).若按照B<=C来排序且能排成功,上面的必为真理,则邻项交换不会更劣.
适用范围: 全部.
例子: (P2123.当邻项交换时通过(1)可以统一形式,通过(2)可以证明相同两人的排序关系.)
(P6927.基本类似.)
4* sort的"严格弱序"要求
f(x,x)=false ; f(x,y)!=f(y,x) ; f(x,y) & f(y,z) => f(x,z)=true.
当式子部分正确时,不妨在相等时特殊处理,若能通过全排列检验,则cmp正确.
例子: (P2123.在相等时特殊处理,验证了其满足严格弱序,则该cmp正确.)
(P6927.化简后的式子发现相等时交换不会有影响,因此可以视为"同一个数")
2* 为后人着想
适用范围: 需满足的要求有重复内容时.
例子: (P1645.按照右端点排好后从右往左填写.)
(AT4173.为岛屿标号后要求即为在L~R中选择>=1个数,使得总共选的数最少.)
(AT4877.将工资大到小,相等时随便排.放在尽可能晚的时间完成.)
(P1937.按照右端点升序,相同则左端点降序,邻项相减可以证明将右端点大的改为小的,对后面的需求不会更劣.)
2* 字典序最小
为每个位置建立下一个0~9出现的位置的索引,若下一个可填0(需满足0后面的数选一部分或全部能满足要求)则必填.
例子: (P1106.没啥好说的.)
3* 影响,路径,树
例子: (P1090.哈夫曼树:两个数被合并了,但是它们仍然单独存在着,做出着贡献,要用树的深度将其描绘.)
(P4785.i->2i,2i+1就想到完全二叉树的背景.)
2* 类比 & 实际意义
例子: (AT4500.把S看成地,W看成方块;操作即为将方块往左推一格.)
(P6155.将这些数看作一个个泡泡在往上浮,泡泡是无法分辨的.)
(P2751.将时间可视化为柱状图然后进行拼接.)
(P2893.花费带来的能力是,使得两个数变相等且能在一个范围内随意变化.)
(P3545.进货看成一个一个进,类比时间,需求看作工程截止时间和所需时间,完成一个收益+1.)
(P4801.类比打地鼠.)
(CF1601D.类比线段覆盖.)
3* 分解
此处仅记录些巧妙的分解方式.
例子: (AT4720.先找出前两行最大的k个,再将它们和第三行得出最终答案.)
(P2751.拆分为A和B,可发现A仅需按照结束时间用堆做即可.)
(P3162.按照两两中点或原位置分段进行贪心.)
(CF436E.强制左边必选a和右边必不选b,得到排序方法.)
(AT2672.先都选择a后再慢慢改,这时思考:是否有一种排序方法使得左边若改,仅改成b,另一边也仅改成c.)
3* 逆
之前的结果即为现在的开端,此前的操作均将被撤回.逆时间而行.
加入比删去麻烦--你不可以预处理(预留空间,建立索引等).
例子: (P3619.将第一部分后的T加上所有的负值,然后能加|bi|的条件是现在的T>=ti-|bi|)
(P2107.先走到底,再一步步走回去--这使得数只减不增.)
(P3045.利用到了"加入比删去麻烦"的思路.)
(P6602.加点,则一些max不断变小,需线段树维护;反之删点会使得max不断变大,仅需变量维护.)
2* 画图
例子: (AT2044.断掉1连出的边后转变为树,自底向上遍历(都尝试下就知道了),一有不满足的点就直接连到1.)
3* 依赖关系 & 无后顾之忧
先将被依赖的求出,倒推回去.
例子: (P7831.去掉-1相关内容后,最大的边无论是否在环中,凡能经过它则必能无限循环,因此它没有依赖,则该点)
(P3127.假如从大到小遍历,若一个大区间就算里面无障碍物都冲不出去,则它内部的小区间就"无后顾之忧"了--肯定出不去呀;若一个大区间能冲出去,然后找到该区间a内部最大的障碍物并因此分成两块等价的区间b和c,若区间b在理想状态下能冲出b,那么必能冲出a,所以b给它内部的区间树立了信心--让它们无后顾之忧.)
4* 忽略
先忽略一些状况,找到一个普通情况下的最优,然后利用该最优去构造特殊情况下的方案.
or 有些内容对接下来的寻找无用,则可忽略掉.
例子: (P2751.思考B时,先忽略货物产生时间的不同,最后再拼接时间.)
(P1248.是一个反例,因同一个货物在AB加工的时间不同,故这些货物不能视为相同的货物.)
(P2893.当之前的内容"暂定"下来时,它们的位置已经不再有影响,则只关注其大小.)
(CF865D.比如1买2卖,接下来想换成1买3卖,发现就算不知道是在1的时候买入也能计算,故将1忽略.)
3* 少给自己找麻烦
例子: (P3076.先少思考些什么中途放下的操作,只在st,ed之间思考.)
(P2863.忽略修改时改成未出现过的数的情况.)
2* 不变量
追踪每一个数,而不是每一个位置.
例子: (CF549G.发现每个数+当前位置=定值.)
3* 分组
要求选出的数和>一半,可以两两分组后取较大的.
例子: (CF789D.按a大到小排序后,除了前面的1或2个,剩下的两两分组以满足b.)
贪心的原则应该是,对于当前时间p,要得到在收益最大前提下的花费最小,这是局部最优性,以此来更新之后的p.
3* 反悔
部分的反悔就是现在随便买,之后不想要时就退,等价于用多少付多少.
因此就没有了后顾之忧,可以先都买来再慢慢调整.
当然,"都买来"的意思是,对于普通的i有很大可能被先买下来.
例子: (CF865D.股票交易:i天若能卖出,则堆中插入2次,否则插入1次.)
(CF730I.用费用流模型建模,思考流量+1对应的情况,详见费用流.)
4* 猜测的方向
例子: (P4404.C替换了A,B中的一个,之后遇到A或B时却被换掉才尴尬,而与C没啥关系,所以贪心方向应思已有的内容下一次出现的位置.)
0* 类似的题目 (重题)
例子: (P2949,P1986,CF958E2)
标签:思维,位置,--,max,回想,例子,答案,贪心 来源: https://www.cnblogs.com/Fish-Clever/p/16540142.html