C++
$\color{#cc33ff}{— > 算法基础课题解}$
思路:
贪心
$1、将每个区间按右端点从小到大排序$
$2、从前往后依次枚举每个区间$
$\ \ \ \ 如果当前区间已经包含点,则直接pass$
$\ \ \ \ 否则,选择当前区间的右端点$
#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() {
cin >> n;
for (int i = 0; i < n; i ++) {
int l ,r; cin >> l >> r;
range[i] = {l, r};
}
sort(range, range + n); // 排序
int res = 0, ed = -2e9; // ed:上一个选择的点的下标
for (int i = 0; i < n; i ++)
if (range[i].l > ed) { // 如果当前点的左端点大于ed了
res ++;
ed = range[i].r;
}
cout << res;
return 0;
}