【最大不相交区间】区间调度
传送门
题解
\(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);
}