最大不重叠区间

Posted mthoutai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大不重叠区间相关的知识,希望对你有一定的参考价值。

http://zju.acmclub.com/index.php?

app=problem_title&id=1&problem_id=1126

RT,给定n个区间。每一个区间有開始时间si和结束时间ei,

问在数轴上怎样摆放能使在没有重叠区间的情况下区间数目达到最大?

分析:典型的贪心思路。在《算法导论》贪心那一章的第一个样例即是它——活动选择问题

解法:按区间的结束时间从小到大排序后。从小的区间按顺序选取;

(1)假设当前区间与已经覆盖的位置重叠(与当前最右位置进行比較)。则舍弃;

(2)否则将此区间摆放在数轴上并更新当前已经覆盖的最右位置

cpp代码:

#include<iostream>
using namespace std;
int main(){
    struct SEGMENT{
        int x;
        int y;
    };
    int n,si,ei,pos,k,tmp,i,cur;
    struct SEGMENT seg[101];
    while(cin>>n){
        pos = 0;
        if(n==0)break;
        while(n--){
            cin>>si>>ei;
            seg[pos].x=si;
            seg[pos].y=ei;
            pos++;
        }
        //BubbleSort
        for(k=1;k<pos;k++){
            for(i=0;i<pos-k;i++){
                if(seg[i].y>seg[i+1].y){
                    //swap
                    tmp=seg[i+1].y;
                    seg[i+1].y=seg[i].y;
                    seg[i].y=tmp;
                    tmp=seg[i+1].x;
                    seg[i+1].x=seg[i].x;
                    seg[i].x=tmp;
                }
            }
        }
        //main process
        cur=seg[0].y;
        int cnt=1;
        for(k=1;k<pos;k++){
            if(seg[k].x>=cur){
                cur=seg[k].y;
                cnt++;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}


以上是关于最大不重叠区间的主要内容,如果未能解决你的问题,请参考以下文章

1133 不重叠的线段 (贪心算法,最大区间不重合问题)

51nod 1133 不重叠的线段 (贪心,序列上的区间问题)

重叠区间的最大子集数

使用间隔树的最大间隔重叠[关闭]

区间的最大重叠次数

最大不相交区间数+最少区间数覆盖问题 贪心思想