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;
    }



  • 相关阅读:
    edu_2_4_1
    edu_2_3_2
    edu_2_3_1
    edu_2_2_2
    edu_2_1_1
    edu_2_2_1
    hdu 1270 小希的数表
    hdu 2151 worm
    hdu1089 Ignatius's puzzle
    hdu 2190 悼念512汶川大地震遇难同胞——重建希望小学
  • 原文地址:https://www.cnblogs.com/01world/p/5651224.html
Copyright © 2011-2022 走看看