POJ 1328Radar Installation

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 2
1 2
-3 1
2 1

1 2
0 2

0 0

Sample Output

Case 1: 2
Case 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 3


4 5
-5 3
-3 5
2 3
3 3

20 8
-20 7
-18 6
-5 8
-21 8
-15 7
-17 5
-1 5
-2 3
-9 6
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 7
9 6
10 5
0 0

2 3
0 2
2 3

2 3
0 2
1 3

3 3
1 2
-3 2
2 4

8 5
2 4
-4 4
-3 3
-3 1
-3 0
-1 0
0 5
6 0

3 0
1 2
-3 1
2 1

3 2
1 2
-3 1
2 1

1 2
0 2


2 3
0 2
2 3

4 -5
4 3
4 3
2 3
6 -9



3 -3
1 2
-3 2
2 1

6 2
1 2
1 2
1 2
-3 1
2 1
0 0

1 2
0 2

2 3
0 2
1 3

3 10
1 10
2 3
4 5

3 5
1 10
2 3
4 5

4 7
1 10
2 3
4 5
0 0

3 9
1 10
2 3
4 5
0 0

================结果
Case 1: 1
Case 2: 2
Case 3: 4
Case 4: 1
Case 5: 1
Case 6: -1
Case 7: 3
Case 8: -1
Case 9: 2
Case 10: 1
Case 11: 1
Case 12: -1
Case 13: -1
Case 14: 2
Case 15: 1
Case 16: 1
Case 17: 1
Case 18: -1
Case 19: -1
Case 20: -1


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值