1. 程式人生 > >Codeforces 527D 【Clique Problem】 題解

Codeforces 527D 【Clique Problem】 題解

這是一道神奇的貪心題。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
    int l;
    int r;
}a[2000005];
bool comp(node c,node d)
{
    if(c.l<d.l)
        return 1;
    if(c.l>d.l)
        return 0;
    if(c.r<d.r)
        return 1;
    return 0;
}
int main()
{
    int n,ans=0;
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        int x,w;
        scanf("%d%d",&x,&w);
        a[i].l=x-w;
        a[i].r=x+w;
    }
    sort(a+1,a+n+1,comp);
    for(int i=n;i>=1;--i)
    {
        int len=i;
        ans++;
        while(i-1<=n&&a[len].l<a[i-1].r)
            --i;
    } 
    cout<<ans;
    return 0;
}

對於每一個點,你可以把它視為一條線段,左端點為x-w,右端點為x+w。這樣對於每個abs(xi-xj)>=wi+wj,我們預設xi>=xj,那麼就可以轉化為xi-wi>=xj+wj,由此就可以退出由i號點構造出來的線段的左端點在由j號點構造出來的線段的右端點的右邊,即這兩條線段沒有交點。因此這道題目就變成了:求n條線段中最多能選出多少條不相交的線段