问题:
https://www.acwing.com/activity/content/problem/content/1112/
题目分析 :
与最小选点数量题目一样的思路,最小选点数量其实就是最大不相交区间数量,两个区间相交了就一定有相同的选点。
先按照左端点排序,再取第一个区间的右端点依次对区间进行判断即可。
代码实现:
数据范围
最大值不超过2e9可以使用int存储数据
代码思路
使用结构体存储区间,同时重新定义小于号。如果使用pair来存区间端点就不需要重新定义小于号了
代码
// 使用struct存储区间端点
#include<iostream>
#include<algorithm>
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()
{
int n ;
cin >> n ;
for(int i = 0 ; i < n ; i ++)
{
int l, r ;
scanf("%d%d", &l, &r) ;
range[i] = {l, r} ;
}
sort(range, range + n) ;
int res = 0, ed = -1e11 ;
for(int i = 0 ; i < n ; i ++)
{
int l = range[i].l, r = range[i].r ;
if(l > ed)
{
res ++ ;
ed = r ;
}
}
cout << res << endl ;
return 0 ;
}
// 使用pair存储
#include<iostream>
#include<algorithm>
using namespace std ;
typedef pair<int, int> PII ;
const int N = 1e5 + 10 ;
int n ;
PII range[N] ;
int main()
{
cin >> n ;
for(int i = 0 ; i < n ; i ++)
{
int l, r ;
scanf("%d%d", &l, &r) ;
range[i] = {r, l} ;
}
sort(range, range + n) ;
int res = 0, ed = -1e11 ;
for(int i = 0 ; i < n ; i ++)
{
int l = range[i].second, r = range[i].first ;
if(l > ed)
{
res ++ ;
ed = r ;
}
}
cout << res << endl ;
return 0 ;
}