数轴上有n 个点,第i 个点的坐标为xi,权值为wi。两个点i,j之间存在一条边当且仅当 abs(xi-xj)>=wi+wj。 你需要求出这张图的最大团的点数。
Solution
把每个点看作以 ((x_i,0)) 为圆心,半径为 (r_i) 的圆
那么如果不相交就有边相连
干脆看作线段吧,所以就是求最大不相交线段数
这就是一个很基础的贪心,以右端点为第一关键字,左端点为第二关键字 sort
然后“能取就取”即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 400005;
int n,x[N],w[N];
struct interval {
int l,r;
bool operator < (const interval &b) const {
return r < b.r;
}
} I[N];
signed main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>x[i]>>w[i];
for(int i=1;i<=n;i++) {
I[i].l=x[i]-w[i];
I[i].r=x[i]+w[i];
}
sort(I+1,I+n+1);
int pos=-1e9,ans=0;
for(int i=1;i<=n;i++) {
if(I[i].l>=pos) {
++ans;
pos=I[i].r;
}
}
cout<<ans;
}