区间选点问题
基本流程:
1.将每个区间按照右端点从小到大排序
2.依次从前往后枚举每个区间
2.1如果当前区间已经被覆盖(包含点)直接pass
2.2否则选择当前区间的右端点
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+ 10;
int n;
struct Range
{
int l , r;
bool operator < (const Range &W)const
{
return r<W.r;
}
}range[N];
int main()
{
cin>>n;
for(int i = 0 ;i < n; i++)
{
int l,r;
scanf("%d%d",&l,&r);
range[i] = {l,r};
}
//1.按照区间右端点排序
sort(range,range+n);
int res = 0,ed = -2e9;
for(int i = 0; i < n; i ++)
{
//2.1如果当前区间已经被覆盖(包含点)PASS
//2.2否则选择当前区间的右端点
if(range[i].l > ed)
{
res++;
ed = range[i].r;
}
}
cout<<res;
return 0;
}