【最大不相交区间】区间调度

传送门

题解

\(N\)个闭区间\([ai,bi]\),请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。
输出可选取区间的最大数量。

数据范围

\(\begin{array}{l}1 \leq N \leq 10^{5} \\ -10^{9} \leq a_{i} \leq b_{i} \leq 10^{9}\end{array}\)

题解

(1)将每个区间按照右端点从小到大排序
(2)从前往后依次枚举每个区间
如果当前区间已经包含点\(pass\)
否则选择当前区间的右端点
贪心证明:结束时间越早,后面可以选择的工作就越多

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define fi first
#define se second 
typedef pair<int,int> pii;
const int N=1e5+10;
int n;
pii e[N];
int main(){
    scanf("%d",&n);
    rep(i,0,n) scanf("%d%d",&e[i].se,&e[i].fi);

    sort(e,e+n);
    int now=e[0].fi;
    int ans=1;
    rep(i,1,n){
        if(now >= e[i].se && now <= e[i].fi) continue;
        else{
            now=e[i].fi;
            ans++;
        }
    } 
    printf("%d\n",ans);
}
posted @ 2020-06-18 22:54  Hyx'  阅读(224)  评论(0编辑  收藏  举报