将每个区间按照右端点从小到大进行排序
从前往后枚举区间,end值初始化为无穷小
如果本次区间不能覆盖掉上次区间的右端点, end < node[i].a
说明需要选择一个新的点, res ++ ; end = node[i].b
如果本次区间可以覆盖掉上次区间的右端点,则进行下一轮循环
时间复杂度 O(n)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct node{
int a,b;
bool operator < (node&t)const{
return b<t.b;
}
}node[N];
int n;
int main(){
cin>>n;
for(int i=0;i<n;i++)
cin>>node[i].a>>node[i].b;
sort(node,node+n);
int end=-2e9,res=0;
for(int i=0;i<n;i++){
if(node[i].a>end){
res++;
end=node[i].b;
}
}
cout<<res<<endl;
}