POJ 1328Radar Installation

来源:互联网 发布:cf免费刷枪软件 编辑:程序博客网 时间:2024/05/21 17:38

Radar Installation

Description

Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, so an island in the sea can be covered by a radius installation, if the distance between them is at most d. 

We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates. 
 
Figure A Sample Input of Radar Installations


Input

The input consists of several test cases. The first line of each case contains two integers n (1<=n<=1000) and d, where n is the number of islands in the sea and d is the distance of coverage of the radar installation. This is followed by n lines each containing two integers representing the coordinate of the position of each island. Then a blank line follows to separate the cases. 

The input is terminated by a line containing pair of zeros 

Output

For each test case output one line consisting of the test case number followed by the minimal number of radar installations needed. "-1" installation means no solution for that case.

Sample Input

3 21 2-3 12 11 20 20 0

Sample Output

Case 1: 2Case 2: 1


题目的意思就是 :把x轴当作海岸线 , x轴上方为海 , 海中有许多小岛(用坐标表示),  在x轴要设置雷达 , 题目给了雷达的覆盖范围半径d,  问要把所有的小岛覆盖  所需雷达的最少数目  。

思路 :以小岛的坐标为圆心,以雷达的半径为半径画圆,会与x轴有一个或两个交点(也可能没有),两个圆可能会有重叠部分,只要雷达处于重叠部分内(图中x轴为黑色的部分),只用一个雷达将这两个岛屿覆盖。(见下图,可能画的不太标准,但是意思能表达清楚)。。



需要注意的是

如果有一个小岛不能被覆盖的话 输出-1 但是输出的时候也要加上 Case %d  因为这个WA一次 ; 还有一点要想到的是 当给出的雷达半径为0 的时候 也是要输出-1 的 所以while(scanf ("%d%d",&m,&d)&&m&&d)这样是不对滴  又WA了好多。。。

总而言之题目不难 有了思路基本很快就能做出来,注意上边那段话。。

代码之后将会有许多测试数据 。。



#include <stdio.h>#include <stdlib.h>#include <math.h>double x[10000],y[10000],ll[10000],rr[10000],t;int m,d,i,j;int main (){    int l=1;    while (~scanf ("%d%d",&m,&d))    {        if (m==0 && d==0)            break;        int f=1,sum=1;        for (i=0; i<m; i++)        {            scanf ("%lf %lf",&x[i],&y[i]);            if (y[i]>d)                f=0;        }        if (f==0 || d==0)        {            printf ("Case %d: -1\n",l++);            continue;        }        for (i=0; i<m-1; i++)        {            for (j=0; j<m-1-i; j++)            {                if (x[j] > x[j+1])//按x轴排序                {                    t=x[j];                    x[j]=x[j+1];                    x[j+1]=t;                    t=y[j];                    y[j]=y[j+1];                    y[j+1]=t;                }            }        }        for (i=0; i<m; i++)        {            double s = sqrt (d*d-y[i]*y[i]);            ll[i] = x[i] - s;            rr[i] = x[i] + s;        }        double x = rr[0];        for (i=1; i<m; i++)        {            if (ll[i] > x)//这里的意思就是如果下一个的ll坐标比上一个的rr坐标大的话,也就是两个圆没有重叠部分             {                x=rr[i];//x为下一个圆的rr坐标                sum++;            }            //另外为什么还要加下边这个if 呢 ??好好想想 就能明白            if (rr[i] < x)            {                x=rr[i];            }        }        printf ("Case %d: %d\n",l++,sum);    }    return 0;}


测试数据:来自http://poj.org/showmessage?message_id=141734

2 5-3 4-6 34 5-5 3-3 52 33 320 8-20 7-18 6-5 8-21 8-15 7-17 5-1 5-2 3-9 61 22 33 44 55 66 77 88 79 610 50 02 30 22 32 30 21 33 31 2-3 22 48 52 4-4 4-3 3-3 1-3 0-1 00 56 03 01 2-3 12 13 21 2-3 12 11 20 22 30 22 34 -54 34 32 36 -93 -31 2-3 22 16 21 21 21 2-3 12 10 01 20 22 30 21 33 101 102 34 53 51 102 34 54 71 102 34 50 03 91 102 34 50 0================结果Case 1: 1Case 2: 2Case 3: 4Case 4: 1Case 5: 1Case 6: -1Case 7: 3Case 8: -1Case 9: 2Case 10: 1Case 11: 1Case 12: -1Case 13: -1Case 14: 2Case 15: 1Case 16: 1Case 17: 1Case 18: -1Case 19: -1Case 20: -1


0 0
原创粉丝点击