由于存在区间包含的关系,被包含的小区间满足时大区间也一定满足。
把所有区间按照右端点从大到小排序。
如果右端点相等,按照左端点从大到小排
不妨想想,取哪个点
由于右端点是从小到大,可以取最上面那个区间的右端点
1.如果后面区间的左端点小于该区间,那么就是包含,就一定取得到
2.如果后面区间的左端点大于该区间,依然被取到
此时取得的区间最多
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e4+7;
const int inf=0x3f3f3f3f;
struct node {
int x,y;
}a[maxn];
bool cmp(node w,node q)
{
if (w.y==q.y)
return w.x>q.x;
return w.y<q.y;
}
int main()
{
int n;
cin>>n;
for (int i=0;i<n;++i)
{
cin>>a[i].x;
int m;
cin>>m;
a[i].y=m+a[i].x;
}
sort(a,a+n,cmp);
int r=a[0].y;
int cnt=1;
for (int i=1;i<n;++i)
{
if ((r-1)>=a[i].x&&(r-1)<=a[i].y)///判断1和2所包含的情况
{
continue;
}
++cnt;
r=a[i].y;///更新
}
cout<<cnt<<endl;
return 0;
}



京公网安备 11010502036488号