雷达安装(贪心算法)

来源:互联网 发布:淘宝怎么设置不同规格 编辑:程序博客网 时间:2024/04/27 06:42
问题五: 雷达安装
输入文件: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;   
}
 
}
   
原创粉丝点击