poj 1328 Radar Installation

来源:互联网 发布:小站雅思mac 编辑:程序博客网 时间:2024/05/23 17:18

        题意:平面上有一些点,你需要在x轴上添加一些半径为d的圆,使得所有点都在圆的范围内,求最少添加圆的数量。

        思路:贪心。对每个点,计算圆能把它包含在内的最大横坐标,对它排序、然后按顺序检查一遍就好了。


#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include <map>#include <vector>#include <set>#include <string>#include <math.h>using namespace std;const double eps=1e-8;inline double fabs(double x){    if(x<0)x=-x;    return x;}struct Node{    int x,y;    double a;    bool operator<(const Node& t)const{        return a<t.a;    }};Node node[1010];int n;int d;inline bool judge(double x,double y,double radar){    if( (double)d*d >=fabs(x-radar)*fabs(x-radar)+y*y  ){        return 1;    }    return 0;}int main(){    int cas=0;    while(cin>>n>>d){        cas++;        if(n==0&&d==0)break;        bool ok=1;        for(int i=0;i<n;i++){            scanf("%d%d",&node[i].x,&node[i].y);            if(node[i].y>d)ok=0;            if(ok)node[i].a=node[i].x+sqrt(d*d-node[i].y*node[i].y);        }        if(!ok){            printf("Case %d: ",cas);            cout<<-1<<endl;            continue;        }        sort(node,node+n);                int ans=0;        for(int i=0;i<n;){                double radar=node[i].a;                ans++;                i++;                while(judge(node[i].x,node[i].y,radar)&&i<n){                    i++;                }        }        printf("Case %d: ",cas);        cout<<ans<<endl;    }    return 0;}


0 0
原创粉丝点击