• 简单贪心模型(NOIP考点)


           这两天把几个贪心模型打了一遍,这里就把模型及其证明总结一下。

    贪心性质:

    1.局部最优解----->全局最优解

    2.无后效性(贪心的选择只取决于之前的状态,后面的选择不会影响当前的选择)。

    模型1:选择不想交区间问题

    题目:给定n个开区间(ai , bi),选择尽量多个区间,使得这些区间两两没有公共点。

    思路:用b(i)排序,且b(i)<=b(i+1),若当前区间的左端点(大于等于)上一选择区间的右端点,则可以选择该区间。

    证明:以后再补吧...

    模型2:区间选点问题

    题目:给定N个闭区间【ai,bi】,在数轴上选尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。

    思路:很明显,我们希望的就是一个点能在尽可能多的区间中。先将区间用b(i)排序,且b(i)<=b(i+1)。对于第一个区间,其它所有区间的右端点都在它的区间的右端点的右边,所以我们选这个区间的右端点。所以这个结论可以推广到所有的区间,但是如果当前区间已经被覆盖了,就没有必要再取选点了。

    证明:一般用反证法,假设我们不选取每个区间的右端点,而选择靠左的某个点,其坐标为i,如果有区间左端点为i+1,那就说明选的这个点不是最优的。所以选择右端点是最优的。

    模型3:区间覆盖问题

    题目:给n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定的线段区间[s,t]。

    思路:按照ai<ai+1<ai+2<...<ai+n排序。开始,我们选择覆盖s点中的区间,右端点最大的区间,更新s点为所选区间右端点。//这个的实现我要花较多时间调...

    证明:这个比较显然吧!

    模型4:流水作业调度问题

    题目:...懒得填坑

    思路:...懒得填坑

    证明:...懒得填坑

    模型5:带期限和罚款的单位时间任务调度

    题目:有n个任务,每个任务都需要1个时间单位执行,任务i的截止时间di(1<=di<=n)表示要求任务i在时间di结束时必须完成,误时惩罚wi表示若任务i未在时间di结束之前完成,将导致wi的罚款。

                确定所有任务的执行顺序,使得惩罚最少。

    思路:我们肯定希望wi大的先被完成,所以我们按照wi从小到大排序,开一个数组记录每一单位时间是否被占用,遇到每一个任务,尽量把当前任务放在靠近截止时间的位置,如果放不下就舍弃,可以用while实现就行了。其实还有一个小小的优化,即f[i]表示i之前的时间是否被占用,如果全部被占用,就没有必要while了,直接continue即可,这叫空间换时间??

    证明:可以用反证法。假设当前放法不是最优的,那么必然有一个任务J满足w[j]<=w[i],i为已经安排的任务,任务j若是替代i,则明显不是最优的。

              综上所述模型是死的,面对贪心题,应回想起各类模型,找与题目的联系,从模型入手,找到适合题意的贪心策略。

  • 相关阅读:
    关于Android架构那些事
    关于投资那些事
    关于单例模式的N种实现方式
    关于如何避免Android中Bitmap引起的OutOfMemoryError
    关于Java设计模式的一些概况
    阿里云服务器使用记录:服务器运行的网页无法访问
    毕业设计进度:3月22日
    前端框架:bootstrap多个模态框跳转使用时发生的页面左移问题
    毕业设计进度:3月20日
    毕业设计进度:3月19日
  • 原文地址:https://www.cnblogs.com/sky-zxz/p/9614862.html
Copyright © 2020-2023  润新知