zoukankan      html  css  js  c++  java
  • 【文文殿下】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;
    }
    
  • 相关阅读:
    JAVA面试题
    Io流
    初识线程池
    理解事务的4种隔离级别
    简单认识Git与GitHub
    JAVA自动装箱和拆箱
    代码块以及他们的执行顺序
    反射机制
    java Excel表格
    访问修饰符的含义分析
  • 原文地址:https://www.cnblogs.com/Syameimaru/p/10451416.html
Copyright © 2011-2022 走看看