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

 

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

posted @ 2018-09-09 20:10  zxza695  阅读(390)  评论(0编辑  收藏  举报

Contact with me