CF527D

题面

这题还挺水的,把那个式子稍微变形一下就可以的到xi-wi>=xj+wj,易知:若把每个点看做一条线段,左端点是xi-wi,右端点是xi+wi,就只要求最多的不重叠的线段数就可以了,然后就是乱搞了

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=200005;
int n;
struct point{int x,w;}a[N];
inline bool cmp(point a,point b){return a.x<b.x;}
struct node{int l,r;}line[N];
inline bool cmp1(node a,node b){return (a.r!=b.r)?(a.r<b.r):(a.l<b.l);}
int main()
{
    int i,re=0,tmp=-2e9; scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].w); sort(a+1,a+n+1,cmp);
    for(i=1;i<=n;i++)line[i].l=a[i].x-a[i].w,line[i].r=a[i].x+a[i].w; sort(line+1,line+n+1,cmp1);
    for(i=1;i<=n;i++)
    {
        if(tmp<=line[i].l){tmp=line[i].r; re++;}
    }printf("%d\n",re);
}

原文地址:https://www.cnblogs.com/gaojunonly1/p/9736518.html

时间: 2024-10-23 00:43:31

CF527D的相关文章

CF527D Clique Problem

CF527D Clique Problem 题意简述 数轴上有n 个点,第i 个点的坐标为xi,权值为wi.两个点i,j之间存在一条边当且仅当 abs(xi-xj)>=wi+wj. 你需要求出这张图的最大团的点数.(团就是两两之间有边的顶点集合) solution 简单贪心 化简原式:就是找xi-wi>=xj-wj 那对于一个点i,设li=xi-wi,ri=xi+wi 把每一个点看作[li,ri]间的一条线段,只要表示两点的 线段不重叠,就有一条边,然后就是一道贪心了 CF里面的神奇思维题,难