ACM經典題型,雷達找小島
題目:Radar Installation (pku 1328)
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
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 Sample Output
3 2 Case 1: 2
1 2 Case 2: 1
-3 1
2 1
1 2
0 2
0 0
#include<stdio.h>
#include<math.h>
struct dataA
{
double left;
double right;
};
int main()
{
int r,t,h=0,i=0;
double x,y;
struct dataA temp,lr[1000];
while(1)
{
scanf("%d %d",&t,&r);
if(r==0&&t==0)
return 0;
int count=0,j;
if(t>0&&t<=1000)
{
for(i=0;i<t;i++)
{
scanf("%lf %lf",&x,&y);
if(y>r||y<0)
{
count=-1;
continue;
}
lr[i].left=x-sqrt(r*r*1.0-y*y);
lr[i].right=x+sqrt(r*r*1.0-y*y);
}
}else{
count=-1;
}
if(count!=-1)
{
count=1;
for(i=0;i<t;i++)
{
for(j=0;j<t-i-1;j++)
{
if(lr[j].left>lr[j+1].left)
{
temp=lr[j];
lr[j]=lr[j+1];
lr[j+1]=temp;
}
}
}
double temp1 = lr[0].right;
for(j=1;j<t;j++)
{
if(lr[j].right<=temp1){
temp1=lr[j].right;
}
else if(lr[j].left>temp1)
{
count++;
temp1=lr[j].right;
}
}
}
printf("Case %d: %d\n",h+1,count);
h++;
}
return 0;
}