zoukankan      html  css  js  c++  java
  • 贪心题目大赏

    上接: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的边

  • 相关阅读:
    [导入]Zanzarah: The Hidden Portal Cheats
    [导入]Zanzarah Walkthrough
    Each的实现
    关于SQL命令中不等号(!=,<>)
    获取当前运行函数及调用函数
    MVC3.0学习2Razor视图引擎基础语法
    MVC 3.0 学习1
    java.io.IOException: Too many open files错误解决方案
    linux下执行命令输出乱码解决方案
    通用代码引擎生成工具 XDoclet 介绍
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11183637.html
Copyright © 2011-2022 走看看