贪心题目大赏
作者:互联网
上接:DAY 1
贪心题目大赏
一、前言
线性复杂度,N<=10^5 n√n可以,N<=10^6,nlogn可以
找规律,找贪心规律,找反例验证
贪心一般问最优,抽象成函数最优解
此时会陷入局部最优
二、贪心的数学背景
什么部分背包啊,删数问题啊,一般都是贪心
把题目抽象成函数,每次都往最优走
DP,贪心,搜索:解决问题最优化 ,看数据范围区分
数据小(贪心??)
DFS算算方案总数,指数级一般为搜索
有的题目想了贪心3种还有反例,别贪心了。。
积累题量!!!
五、贪心典型题
(看一眼数据:10^8如果与题目中B没关系,可能与复杂度有关)
贪心策略:价格从低到高,买够为止
反证:若剩下的有一个K”,比K小,那么交换,稳赚不赔
所以,在买K之前,所有比他便宜的都买完了
r
sum =( Σ a[i] )mod M
i=l
直觉:区间和可以转化成前缀和的差
先考虑不取模:
Si 记录前缀和 X枚举前缀和S1~Sn,减去到目前为止遇到的最小前缀和 取模后答案可能就是这样啦: 1. x-y (y<=x) 此时显然是y越接近0越好 2.x+m-y(y>x) 此时显然是y越接近x越好
这个就是上面的活动安排啦
其实一开始想的是以每个雷达为圆心画圆,但是你也可以以每个岛屿为圆心,雷达半径画圆,然后看它和海岸线相交成一条线段,转换为点覆盖线段的问题,类似于种树问题
首先把能回血的怪打死(不然你后面血不够咋办)
打回血怪的顺序按照消耗血量升序排列
然后再考虑杀掉血怪
当我们杀完所有怪物,最后的体力值是确定的
然后我们倒着看,杀掉血怪的时候,我们当做将血瓶吐出来还给掉血怪,然后掉血怪把消耗的血再还给你,然后推回去,看看能不能到达杀回血怪最后的血量巅峰,所以倒着看,处理就和杀回血怪差不多了,倒着看是按照消耗血量升序,正着看就是降序了
把问题分成两部分:
1.处理回血怪,到达血量巅峰
2.处理掉血怪,看看能不能回到血量巅峰
贪心策略:打表求阶乘,然后对于n,从大到小,阶乘能减去的就减去,否则跳过,考虑下一个阶乘
为什么这样可以呢?
本质和二进制转换是一样的
二进制转化本来是用的短除法对吧
然后你考虑对于一个n,如果当前遇到一个2^k,最大的,如果你不减去他,那么后面的数加起来也没他大
这里呢就相当于把原来的二进制转化为阶乘进制辣
贪心策略:
- 可以把最大的数提到前面,那就往前提
- 不能。那就次之
思路,把前K个数最大的放到前面
(以上是由于看错题,看成和了)
答案是个序列,求的是序列
原序列是 1 2 3 4 5 6
如果交换两个数字可以得到更优答案,那就交换
假设已经排好序了,现在交换相临两个
3,4,交换,前面不影响,前缀S,后边也不影响
如果交换的话,上边的式子小于下边的式子
答案只和2,,4,相有关
一旦这样就交换
所以说就是按照每个大臣左右手数字乘积从小到大排序
、
思索样例怎么来的呢?
1,2先过,1送回手电筒,5,10一起过,2送回手电筒,1,2一起过
ans = 2+1+10+2+2 = 17
最慢两个人一定一起过河
过河时间升序排列:A,B,C,D
考虑把最慢的两个人一起送过河
两个人过河牵扯四个人,因为走两次
两种方案:
1.A无脑来回跑
AD A AC A AB
Ans=D+A+C+A+B
2.AB一起作战送
AB A CD B AB
Ans=B+A+D+B+B
然后化成子问题,每次送完,减少2个人
最后剩4个人或3个人
处理4个人按上面做
处理3个人,A来回送人显然是最快的,时间一定是A+B+C
搜索树
0~n最优到次优
贪心是K=0这么走
K允许在某些分支上走次优解
K=1允许走一次1的边
标签:AB,题目,前缀,交换,血量,阶乘,大赏,贪心 来源: https://www.cnblogs.com/xiaoyezi-wink/p/11183637.html