1. 程式人生 > >ACM經典題型,雷達找小島

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.

http://poj.org/images/1328_1.jpg 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                 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;
}