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\n",++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\n",++cas,ans);
    }
    return 0;
}



posted @ 2016-04-21 12:48  HARD_UNDERSTAND  阅读(369)  评论(0编辑  收藏  举报