其他分享
首页 > 其他分享> > 贪心题目大赏

贪心题目大赏

作者:互联网

上接: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越好

 

 

 

 

这个就是上面的活动安排啦

 

 

 

P1325 雷达安装

 

其实一开始想的是以每个雷达为圆心画圆,但是你也可以以每个岛屿为圆心,雷达半径画圆,然后看它和海岸线相交成一条线段,转换为点覆盖线段的问题,类似于种树问题

 

       

首先把能回血的怪打死(不然你后面血不够咋办)

打回血怪的顺序按照消耗血量升序排列

然后再考虑杀掉血怪

当我们杀完所有怪物,最后的体力值是确定的

 然后我们倒着看,杀掉血怪的时候,我们当做将血瓶吐出来还给掉血怪,然后掉血怪把消耗的血再还给你,然后推回去,看看能不能到达杀回血怪最后的血量巅峰,所以倒着看,处理就和杀回血怪差不多了,倒着看是按照消耗血量升序,正着看就是降序了

把问题分成两部分:

1.处理回血怪,到达血量巅峰

2.处理掉血怪,看看能不能回到血量巅峰

 

 


贪心策略:打表求阶乘,然后对于n,从大到小,阶乘能减去的就减去,否则跳过,考虑下一个阶乘

为什么这样可以呢?

本质和二进制转换是一样的

二进制转化本来是用的短除法对吧

然后你考虑对于一个n,如果当前遇到一个2^k,最大的,如果你不减去他,那么后面的数加起来也没他大

 

 这里呢就相当于把原来的二进制转化为阶乘进制辣

 

 

 

 

贪心策略:

  1. 可以把最大的数提到前面,那就往前提
  2. 不能。那就次之

思路,把前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