描述
假设滑行是一条无限长的直线。陆地在海岸线的一边,海洋在另一边。每个小岛都是位于海边的一个点。而任何位于海岸上的雷达装置只能覆盖d距离,因此,如果它们之间的距离不超过d,那么海上的岛屿可以被半径装置覆盖。
我们使用笛卡尔坐标系,将滑行定义为x轴。海侧在x轴上方,陆侧在x轴下方。考虑到每个岛屿在海上的位置,以及雷达装置的覆盖距离,您的任务是编写一个程序,以找到覆盖所有岛屿的雷达装置的最小数量。请注意,岛的位置由其x-y坐标表示。
输入
3 2
1 2
-3 1
2 1
1 2
0 2
0 0
输出
Case 1: 2
Case 2: 1
代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int T=0;
while (true){
T++;
boolean judge1=false;
int n=in.nextInt();
int d=in.nextInt();
if (n==0&&d==0){
break;
}
Node arr[]=new Node[n];
for (int i=0;i<n;i++){
int x=in.nextInt();
int y=in.nextInt();
if (y>d){
judge1=true;
}
arr[i]=new Node(x-Math.sqrt(d*d-y*y),x+Math.sqrt(d*d-y*y));
// arr[i].left=x-Math.sqrt(d*d-y*y);
// arr[i].right=x+Math.sqrt(d*d-y*y);
}
if (judge1){
System.out.printf("Case %d: -1\n",T);
continue;
}
Arrays.sort(arr);
int res=1;
double now =arr[0].right;
for (int i=1;i<n;i++){
if (arr[i].left<=now){
now=Math.min(now,arr[i].right);
}else {
res++;
now=arr[i].right;
}
}
System.out.printf("Case %d: %d\n",T,res);
}
}
}
class Node implements Comparable<Node>{
double left;
double right;
public Node(double left,double right){
this.left=left;
this.right=right;
}
@Override
public int compareTo(Node o) {
if (this.left<o.left){
return -1;
}else if (this.left>o.left){
return 1;
}
return 0;
}
}