问题五: 雷达安装
输入文件:Radar.in 标准输出
Description
假定海岸线是一条无限长的直线,陆地在海岸线的一边,海洋在另一边。每个小岛是海洋这边中的一个点,任何一部安在海岸线上的雷达站仅能覆盖距离d,如果一个小岛与雷达站的距离不超过d,那么这个小岛就可被这部雷达站覆盖。
用笛卡尔坐标系,将海岸线作为x轴,海洋位于x轴的上方,陆地在x轴的下方。给出海洋中每个小岛的位置,以及每部雷达站的覆盖距离,写一个程序来找到所需安装的雷达站的最小数,以覆盖所有小岛。注意每个岛屿的位置用x-y坐标表示。
Input
输入由几个测试用例组成。每个测试用例的第一行是两个整数n,d,其中(1<=n<=1000),n是海洋中小岛的个数,d是雷达站的覆盖距离。接下来的n行中,每行表示一个小岛的位置,是一对x,y坐标。每两个测试用例的数据间用一空行隔开。
输入最后以两个0结束。
Output
对于每个测试用例,输出其编号和所需安装的雷达站的最小数目。如果无解,那么就输出-1.
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.io.*;
class point
{
int x;
int y;
public point(int x,int y)
{
this.x=x;
this.y=y;
}
}
class Test5 //贪心算法
{
public static void main(String[] args) throws Exception
{
BufferedReader bf=new BufferedReader(new FileReader(“Radar.in“));
String str;
int rank=0;
while(!(str=bf.readLine()).equals(“0 0“))
{
rank++;
int p=str.indexOf(‘ ‘);
int n=Integer.parseInt(str.substring(0,p));
int d=Integer.parseInt(str.substring(p+1,str.length()));
point POINT[]=new point[n];
int x,y;
for(int i=0;i<n;i++)
{
str=bf.readLine();
p=str.indexOf(‘ ‘);
x=Integer.parseInt(str.substring(0,p));
y=Integer.parseInt(str.substring(p+1,str.length()));
POINT[i]=new point(x,y);
}
sort(POINT);
int sum=0;//可放雷达的最小数目
int index=0;//索引下标
double position;//雷达放置位置
if(!isOk(POINT,d))
System.out.println(–1);
else
{
do{
position=Math.sqrt(d*d–Math.pow(POINT[index].y,2))+POINT[index].x;
index=go(index,position,POINT,d);
sum++;
if(index==-1)break;
}while(true);
}System.out.println(“Case “+rank+“: “+sum);
}
}
public static boolean isOk(point p[],int d)
{
for(int i=0;i<p.length;i++)
if(p[i].y>d)
return false;
return true;
}
public static void sort(point p[])
{
point tmp;
for(int i=0;i<p.length–1;i++)
for(int j=i+1;j<p.length;j++)
{
if(p[i].x>p[j].x)
{
tmp=p[j];
p[j]=p[i];
p[i]=tmp;
}
}
}
public static int go(int index,double position,point p[],int d)
{
int t=-1;//记录point数组的下标
for(int i=index;i<p.length;i++)
{
if(p[i].y*p[i].y+Math.pow(Math.abs(position–p[i].x),2)<=d*d)
t=i;
else if(p[i].x<=position)
{
position=Math.sqrt(d*d–Math.pow(p[i].y,2))+p[i].x;
t=i;
}
else break;
}
if(t==p.length–1)
return –1;
return t+1;
}
}