贪心
看了很多证明,感觉不是很透彻,根据我自己的理解写了这篇题解
ans 表示最优解 cnt 表示所有解中的一个
现在需要证明以下不等式
1) ans <= cnt
2) ans >= cnt
1) 的证明
因为 ans
是所有的解中的最优解(也就是最小的解) 而 cnt
是所有解的区间中的一个解 这个解的集合的最小值当然小于等于解集合中的所有情况
2)证明
我们先根据 1.将每个区间按照右端点进行排序 如果所有区间都不相交 没枚举一个区间都需要 增加一个点, 这是的一般解 cnt 就是所有解的最小值, 因为 cnt 是所有解的最小值, 当然小于等于 解的区间中的所有值。 ans >= cnt
的证
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 100010;
int n;
// 定义一个结构体存放区间端点
struct Range{
int l, r;
// 重载一下方法
bool operator< (const Range &W)const{
// 根据 r 从小到大进行排序
return r < W.r;
}
}range[N];
int main(){
cin >> n;
for(int i = 0; i < n; i++) scanf("%d%d", &range[i].l, &range[i].r);
sort(range, range + n);
int res = 0, ed = -2e9; // -2e9 表示无穷小
// 循环枚举每一个区局
for(int i = 0; i < n; i++)
if(ed < range[i].l){
// 如果当前的点不在当前枚举的区间内,在添加一个点
// 添加的点为当前区间的右端点
res ++ ;
ed = range[i].r;
}
printf("%d", res);
return 0;
}