Radar(nyoj287)贪心

Radar

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述
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.

 

输入
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
输出
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.
样例输入
3 2
1 2
-3 1
2 1

1 2
0 2

0 0
样例输出
Case 1: 2
Case 2: 1
题目大意:
输入小岛的个数n,雷达的半径r,然后输入小岛的位置坐标。雷达只能建在海岸线(即x轴)上。问最少需要几个雷达才能覆盖所有小岛。
#include 
#include 
#include 
#include 
#define N 1000

typedef struct 
{
	double left,right;
}Point;

int cmp(const void *a,const void *b)
{
	return (*(Point *)a).left - (*(Point *)b).left;
}
int main()
{
	int n,i,count,num=1;
	double x[N],y[N],min,r;
	double len;
	Point point[N];
	while(scanf("%d%lf",&n,&r))
	{
		if(n == 0 && r == 0)
			break;
		memset(point,0,sizeof(point));
		for(i=0; i r)
			{
				printf("Case %d:-1\n",num);
				num ++;
				break;
			}
			len = sqrt(r*r-y[i] *y[i]);
			point[i].right = x[i] + len;
			point[i].left = x[i] - len;
		}
		qsort(point,n,sizeof(Point),cmp);

		count = 1;//初始雷达数为1,覆盖第一个小岛
		min = point[0].right;//以第一个小岛与x轴的右交点为标准开始
		for(i=1; i min)//如果后一个小岛的左交点大于前一个的右交点,说明不相交
			{
				count ++;//需要多加一个雷达
				min = point[i].right;//再以下一个小岛的右交点为标准探测
			}
			else
			{
				if(point[i].right < min)//如果,前一个的右交点小于后一个的左交点,前一个的雷达可以覆盖后一个
				{
					//不需要增加一个雷达
					min = point[i].right;
				}
			}
		}
		printf("Case %d: %d\n",num,count);
		num ++;
	}
	return 0;
}

你可能感兴趣的:(贪心算法)