zoukankan      html  css  js  c++  java
  • poj 1328 雷达覆盖 贪心

    题目:


    Figure A Sample Input of Radar Installations

    题意:

    在x轴上某些位置装雷达,问怎么才能使海岛p被信号覆盖,有n个海岛,雷达覆盖范围是d。

    分析:

    考虑一个海岛p,对于覆盖它的雷达放的最优的位置是它在圆圈的边缘上,因为这样这个雷达就可以覆盖更多其他的海岛。那么先按x排序,对于当前的一个圈,看看是否下一个海岛是否可以在圈内,如果可以就在看下一个,不可以就放一个最新的雷达,接下来在比较后面的海盗是否可以放到这个圈内。

    需要注意一种情况,就是对于第i个海岛放的雷达不可以覆盖第i+1个海岛,而第i+1个海岛放的雷达可以覆盖第i个海岛的情况,这种情况,雷达要放在可以覆盖第i+1个海岛的那个位置了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const int N=1009;
    int d,n;
    struct point
    {
        int x,y;
    };
    point p[N];
    bool cmp(const point& a,const point& b){return a.x<b.x;}
    double getx(point a){
        return a.x+sqrt(1.0*d*d-1.0*a.y*a.y);
    }
    int main()
    {
        int cas=0;
        while(~scanf("%d%d",&n,&d)&&(n+d)){
            bool flag=0;
            for(int i=0;i<n;i++){
                scanf("%d%d",&p[i].x,&p[i].y);
                if(p[i].y>d)flag=1;
            }
            if(flag){
                printf("Case %d: -1
    ",++cas);continue;
            }
            sort(p,p+n,cmp);
            double x=getx(p[0]);
            int ans=1;
            for(int i=1;i<n;i++){
                double tmp=getx(p[i]);
                if(p[i].x<x&&x>tmp){
                    x=tmp;continue;
                }
                if(p[i].y*p[i].y+(p[i].x-x)*(p[i].x-x)<=d*d)continue;
                //if(p[i].y*p[i].y+(p[i].x-x)*(p[i].x-x)<=d*d)continue;
                x = getx(p[i]);
                ans++;
            }
            printf("Case %d: %d
    ",++cas,ans);
        }
        return 0;
    }



  • 相关阅读:
    安全测试的概述和用例设计
    性能测试(四)常见调优
    性能测试(三)常见的性能测试缺陷
    Jmeter(七)六种参数化的方式
    Jmeter(六)所有的断言
    接口测试的问题解答
    ES学习
    flutter 之BottomNavigationBar属性
    flutter StaggeredGridView.countBuilder 上方取消空白
    flutter升级、回退到指定版本---mac版
  • 原文地址:https://www.cnblogs.com/01world/p/5651224.html
Copyright © 2011-2022 走看看