POJ 1328 Radar Installation

来源:互联网 发布:c语言学习网站 编辑:程序博客网 时间:2024/06/06 06:55

题意:

  有n个坐标,和半径为d的雷达(具体不知道是什么,读了个大概),输入那个坐标,问在x轴上放几个雷达全部坐标都能扫到,如果有点不能被扫的,输出-1.

思路:

  分别列出坐标在x轴的圆心,当然,圆心必须点的右半部分,或者点下(如果点纵坐标的绝对值大于了d,就标记为1,不用算法,直接输出-1),然后用圆心对结构体进行排序。再从前到后进行判断,如果后面的点不在圆的半径内,就说明必须得多加个雷达,于是对雷达+1,。,记录这个不满足的点,下一次直接从这个不满足的点开始。直到点走完。

代码:

#include<stdio.h>#include<math.h>#include<algorithm>using namespace std;struct Node{    float x,y;    float O;;} a[1010];float cmp(Node b,Node c){    return b.O<c.O;}float absolute(int c){    if(c<0)        return -c;    return c;}int main(){    int cnt=0,n,i;    float d;    while(scanf("%d %f",&n,&d)!=EOF)    {        if(n==0&&d==0)            break;        cnt++;        int Y=0;        for(i=0; i<n; i++)        {            scanf("%f %f",&a[i].x,&a[i].y);            a[i].O=sqrt(d*d-a[i].y*a[i].y)+a[i].x;            if(absolute(a[i].y)>d)                Y=1;        }        if(Y==1)        {            printf("Case %d: -1\n",cnt);            continue;        }        sort(a,a+n,cmp);        int ans=1;        int max=0;        while(max<n)        {            for(i=max+1; i<n; i++)            {                if((a[max].O-a[i].x)*(a[max].O-a[i].x)+a[i].y*a[i].y>d*d)                {                    ans++;                    break;                }            }            max=i;        }        printf("Case %d: %d\n",cnt,ans);    }    return 0;}

0 0
原创粉丝点击