• 简单贪心模型(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,则明显不是最优的。

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

  • 相关阅读:
    浅析如何给Linux中增加磁盘并进行系统盘数据迁移:创建分区、格式化分区、数据迁移、挂载分区
    Linux基础:磁盘管理(df、du、fdisk)、磁盘挂载与卸除、数据盘与系统盘的查看
    Linux基础:文件基础属性及如何更改文件属性、文件与目录管理、linux软硬链接的理解、linux用户和用户组管理
    浅析如何选择picture标签和img标签、如何使用 srcset 和 sizes 属性进行分辨率切换、如何使用picture标签的source和media在不同设备显示不同图像
    浅析flex布局被子元素内容撑破的问题
    SQL优化:慎用标量子查询,改用left join提升查询效率
    【Centos】查询命令
    【RocketMQ】读写队列
    【Centos】命令自定义
    关于 JavaScript 中的 Array.reduce()
  • 原文地址:https://www.cnblogs.com/sky-zxz/p/9614862.html
Copyright © 2020-2023  润新知