(https://www.acwing.com/solution/content/16905/)
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
struct Range
{
int l, r;
bool operator< (const Range &W)const
{
return r < W.r;
}
}range[N];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++ ) {
int m,n;
scanf("%d %d",&m ,&n );
range[i].l=m;
range[i].r=n;
}
sort(range, range + n);
int res = 0, ed = -2e9;
for (int i = 0; i < n; i ++ )
if (ed < range[i].l)
{
res ++ ;
ed = range[i].r;
}
printf("%d\n", res);
return 0;
}
struct Range以及sort调用的代码解释:
(1)结构体的名字是Range,所以range[i] 是 Range 类型的对象,结构体里包含了2个成员变量 int l, r 以及一个重载的 < 运算符函数
(2)由于 range[i] 是 Range 对象,它就具有 Range 结构体中定义的成员变量 l 和 r 以及成员函数 operator
(3)写 return r < W.r; 时:
r 等价于 this->r,访问当前 Range 对象的 r 成员,
W.r 访问的是参数 W 引用指向的另外一个 Range 对象的 r 成员,
因为这两个都是 int 类型的成员变量,编译器清楚地知道该如何比较它们的值。结果就是通过比较两个 Range 对象的 r 成员大小来决定排序顺序
(4)通过定义 operator< 的返回条件为 r < W.r,你等价于告诉 sort 函数:“将 Range 按照 r 的大小从小到大进行排序”,sort在排序过程中需要比较时,会自然调用这个重载的运算符来进行比较
(5)当写 sort(range, range + n) 时,sort 会在内部对区间 (range, range+n) 中的元素进行比较。当需要比较 range[i] 和 range[j] 时,就会调用你重载的 operator< 来判断次序