思路
很显然,这个题目一看就知道是一个贪心题目。
由于我们要放上去尽量多的区间,所以我们可以把这个区间的右端点从小到大排序。为什么我们要按照右端点进行排序呢?因为如果我们选择的右端点越小,我们剩余的空间也就越大。剩余空间越大,可以放置的区间也就越多。所以根据这种思想,我们就会选择将每个区间的右端点从小到大排序。并且这样的出来的答案一定是最多的。
代码
#include<bits/stdc++.h>//万能头
using namespace std;
int n;
int x[100005],p[100005];
struct node
{
int l,r;
bool operator <(const node &n)const
{
return r<n.r;//按照右端点进行排序
}
}arr[100005];//储存每个区间的右端点和左端点
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>x[i]>>p[i];
arr[i].l=x[i]-p[i];//储存左端点
arr[i].r=x[i]+p[i];//储存右端点
}
sort(arr+1,arr+n+1);//排序
int now=INT_MIN,ans=0;
for(int i=1;i<=n;++i)
{
if(arr[i].l>=now)//判断是否可以放下这个区间
ans++,now=arr[i].r;
}
cout<<ans<<endl;//输出答案
}