贪心:选择所有不相交区间中右端点最小的区间
题目分析:1.让所有区间的右端点按从小到大开始排序
2.定义一个end,如果一个区间和end没有交集(l>end),就使得答案+1,然后让他的右端点成为新的end。如果有交集,就直接跳过
1.为什么按照右端点排序
按照左端点升序排序
我们可以发现,下一个区间,可能是被我们完全包含的,此时根据图中的情况,选择cur作为start区间,必然不是最优解,而选择1,2区间才是最优解,因为按照左端点排序,无法确保后面的next区间都不会和cur区间重合,如果和cur区间重合,选择被重合的子区间才是最优解(因为cur区间太大了)
按照右端点升序排序
根据贪心的思想,我们要选择所有符合不相交条件的区间中,右端点最小的区间(反证法),这时候遇到的第一个满足条件的区间就是我们要找的右端点最小的区间
#include <iostream>
#include <algorithm>
using namespace std;
const int N=100005;
struct range
{
int l,r;
bool operator < (const range b)const
{
return r<b.r?true:false;
}
}r[N];
typedef long long ll;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>r[i].l>>r[i].r;
int end=-2e9;
ll res=0;
sort(r,r+n);
for(int i=0;i<n;i++)
{
if(end<r[i].l)
{
res++;
end=r[i].r;
}
}
cout<<res;
return 0;
}