Greedy (interval coverage)

Radar Installation
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 101412   Accepted: 22561

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

The meaning of the title: The top of the x-axis of the map is the sea, and the bottom is the land. There are n small islands in the sea, and the coordinates are (isl[i].x, isl[i].y). There is a radar that can detect a circle with radius d. Ask how many radars to build on the coastline at least to cover all the small islands. Note that the radar is built on the coastline, i.e. on the x-axis.

Idea: Be greedy, build radar from left to right, and cover as many islands as possible. Draw a circle with the island as the center and d as the radius. If the drawn circle has no intersection with the x-axis, it cannot be achieved. If there is an intersection, the coordinates of the intersection of the i-th island and the x-axis are calculated and stored in the structure arrays rad[i].sta and rad[i].end. Sort the structure array in ascending order according to rad[i].end, and then look for the radar from left to right at a time. For rad[i].end is the left coordinate of the current rightmost, for the next island, if rad[j].sta<ran[i].end, then there is no need to build a new radar, and the next island needs to be updated. Otherwise a new radar needs to be built.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
struct island
{
	int x;
	int y;
}isl[1005];//Island coordinates
struct range
{
	float sta;
	float end;
}ran[1005];//With the island as the center and d as the radius, make the intersection area of ​​the circle and the x-axis
bool cmp(range a,range b)
{
	return a.end<b.end;
}
intmain()
{
	int n,d,t=1;
	while(cin>>n>>d&&n!=0)
	{
		int i,j,maxy=0;
		for(i=0;i<n;i++)
		{
			cin>>isl[i].x>>isl[i].y;
			if(isl[i].y>maxy) maxy=isl[i].y;
		}
		cout<<"Case "<<t++<<": ";
		if(maxy>d||d<0)
		{
			cout<<"-1"<<endl;
			continue;
		}
		float len;
		for(int i=0;i<n;i++)//求小岛对应雷达的可能覆盖范围 
		{
			len=sqrt(1.0*d*d-isl[i].y*isl[i].y);
			ran[i].sta=isl[i].x-len;
			ran[i].end=isl[i].x+len;
		}
		sort(ran,ran+n,cmp);//根据ran的end值进行排序 
		int ans=0;
		bool vis[1005];memset(vis,false,sizeof(vis));
		for(int i=0;i<n;i++)
		{//类似的活动选择 
			if(!vis[i])
			{
				vis[i]=true;
				for(j=0;j<n;j++)
				{
					if(!vis[j]&&ran[j].sta<=ran[i].end)
					vis[j]=true;
				}
				ans++;
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325942684&siteId=291194637
Recommended