• 【文文殿下】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
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    11前端css动画
    10前端css文本和字体
    09前端css3渐变
    08前端css3背景
    07前端css3边框和圆角
    06前端css3增加选择器
    堡垒机Teleport
    Sublime Text 3注册及中文乱码问题解决
    Linux部署KMS激活Windows 10和Office 2016
    服务器维护实施步骤
  • 原文地址:https://www.cnblogs.com/Syameimaru/p/10451416.html
Copyright © 2020-2023  润新知