数轴上有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;
}

相关文章:

  • 2022-02-23
  • 2022-01-17
  • 2021-11-02
  • 2021-10-10
  • 2022-12-23
  • 2021-10-25
  • 2022-01-27
  • 2022-12-23
猜你喜欢
  • 2022-02-23
  • 2021-11-03
  • 2021-11-30
  • 2021-08-21
  • 2022-12-23
  • 2022-02-02
  • 2022-12-23
相关资源
相似解决方案