贪心题目大赏

上接:DAY 1

贪心题目大赏

一、前言

线性复杂度,N<=10^5  n√n可以,N<=10^6,nlogn可以

找规律,找贪心规律,找反例验证

贪心一般问最优,抽象成函数最优解

此时会陷入局部最优

 二、贪心的数学背景

什么部分背包啊,删数问题啊,一般都是贪心

把题目抽象成函数,每次都往最优走

DP,贪心,搜索:解决问题最优化 ,看数据范围区分

数据小(贪心??)

DFS算算方案总数,指数级一般为搜索

有的题目想了贪心3种还有反例,别贪心了。。

积累题量!!!

五、贪心典型题

P2983 [USACO10FEB]购买巧克力

(看一眼数据:10^8如果与题目中B没关系,可能与复杂度有关,不过这个题不用想这么多)
 
 
 
 
 
 
 

                    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越好

1422:【例题1】活动安排

 

P1325 雷达安装

 
 

3709: [PA2014]Bohater

 

贪心策略:打表求阶乘,然后对于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的边

原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11183637.html