思路
贪心的证明
假设 ans 是最优解也就是答案, cnt 是普通解,就是满足cnt个点,能使每一个区间都有cnt中的点
1 ans <= cnt
因为ans是最少的点来满足每个区间都有ans的点,也就是说,ans是min(ans,cnt),所以ans是大于等于cnt的
2 ans >= cnt
如果现在有n个区间互不相交,这个时候的cnt , 就是每个区间的右端点,是我们代码实现取的点,
这个时候我们发现ans的值最小得是cnt,所以ans >= cnt
代码
#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()
{
cin >> n ;
for(int i = 0 ; i < n ; i++)
{
cin >> range[i].l >> range[i].r ;
}
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 ;
}
}
cout << res ;
return 0 ;
}