原文链接:最大不相交区间
题目描述:
给定 N 个闭区间 [ai,bi],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。
输出可选取区间的最大数量。。
输入格式
第一行包含整数 N,表示区间数。
接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。
输出格式
输出一个整数,表示所需的点的最小数量。
数据范围
1 ≤N≤ 10^5,
−10^ 9≤ ai≤ bi ≤ 10 ^9
思路:
要使区间选择数量最大,比较排序后的区间时分为两种情况:不相交则数量加一;相交时选择保留区间更靠近左侧的区间,数量不变;若为包含关系,选择区间长度最小的区间,数量不变。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
struct m{
int x,y;
} a[N];
int n,s,t;
bool cmp(m a,m b){
return a.x<b.x||a.x==b.x&&a.y<b.y;
}
int main(){
scanf("%d", &n);
for (int i = 0; i < n; i ++ ){
scanf("%d%d",&a[i].x,&a[i].y);
}
sort(a,a+n,cmp);
int res=1;
s=a[0].x,t=a[0].y;
for (int i = 0; i < n; i ++ ){
//printf("%d %d\n",a[i].x,a[i].y);
if(a[i].x>t){
s=a[i].x,t=a[i].y;
res++;
}
else if(a[i].y<=t){
s=a[i].x,t=a[i].y;
}
}
cout<<res;
return 0;
}