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
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
/**
* Created by 95112 on 11/12/2017.
*/
public class RadarInstallation {
public static void main(String[] args)
{
ArrayList<String> answers = new ArrayList<String>();
int times =1;
Scanner scanner = new Scanner(System.in);
int n,d;
do {
n = scanner.nextInt();
d = scanner.nextInt();
if (n==0 && d== 0)
break;
Island[] islands = new Island[n];
int maxHeigh = 0;
for (int i =0; i < n; i++)
{
int x ,y;
x = scanner.nextInt();
y = scanner.nextInt();
if (maxHeigh<y)
maxHeigh = y;
double dValue = Math.sqrt(d*d - y *y);
islands[i] = new Island(x - dValue,x + dValue);
}
if (maxHeigh > d)
{
answers.add("Case "+times+": -1");
times++;
continue;
}
Arrays.sort(islands, new Comparator<Island>() {
@Override
public int compare(Island o1, Island o2) {
if (o1.left < o2.left)
return -1;
else
return 1;
}
});
int count = 0;
double end = -999999999999999999999999.0;
for (int i =0 ; i< n; i++){
if (islands[i].left <= end){
if (islands[i].right < end)
end = islands[i].right;
}else {
count++;
end = islands[i].right;
}
}
answers.add("Case "+times+": "+count);
times++;
}while (true);
for (String answer : answers){
System.out.println(answer);
}
}
}
class Island{
double left;
double right;
public Island(double x,double y)
{
left = x;
right = y;
}
}