【文文殿下】P3737 [HAOI2014]遥感监测

题解

显然可以把每个观测点,认为是x轴上的一段区间。问题就转换为了:对于x轴上的若干个区间,选取尽可能少的点,使得所有区间都有至少一个点。 这是一个相当经典的贪心问题。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
const int maxn = 110;
struct qwq {
    int vis;
    double x,y;
    const bool operator < (const qwq& rhs) const {
        if(vis||rhs.vis) return vis<rhs.vis;
        if(x==rhs.x) return y<rhs.y;
        return x < rhs.x;
    }
}L[maxn];
int n,r;
bool inside(int a,int b) {
    return L[b].x>=L[a].x&&L[b].y<=L[a].y;
}
int main() {
    scanf("%d%d",&n,&r);
    for(int i = 1;i<=n;++i) {
        int x,y;
        scanf("%d%d",&x,&y);
        double l = sqrt(r*r-y*y);
        L[i].x=x-l,L[i].y=x+l;
    }
    int cnt = 0;
    for(int i = 1;i<=n;++i) {
        for(int j =1;j<=n;++j) {
            if(inside(i,j)&&i!=j&&!L[j].vis) {
                L[i].vis=1;
                ++ cnt;
                break;
            }
        }
    }
    std::sort(L+1,L+1+n);
    n-=cnt;
    double r = -100000000000LL;
    int ans = 0;
    for(int i = 1;i<=n;++i) {
        if(L[i].x<=r) continue;
        ++ans;
        r=L[i].y;
    }
    printf("%d\n",ans);
    return 0;
}
posted @ 2019-02-28 16:46  文文殿下  阅读(337)  评论(0编辑  收藏  举报