华为机试---路灯

题目描述

一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为a i,每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要是这个d最小,请找到这个最小的d。

输入描述:
每组数据第一行两个整数n和l(n大于0小于等于1000,l小于等于1000000000大于0)。第二行有n个整数(均大于等于0小于等于l),为每盏灯的坐标,多个路灯可以在同一点。


输出描述:
输出答案,保留两位小数。

输入例子:
7 15
15 5 3 7 9 14 0

输出例子:

2.5

算法思想:
1.首先将路灯的坐标按照从小到大排序
2.找到坐标数组中间距最大的两个路灯,d = max_distance / 2.0 , 相当于直径
3.如果第1个灯的坐标不是从起点0开始,第n个灯的坐标不是在终点d结束,要保证灯光覆盖街头和街尾,
  将边界距离的半径转化为直径,然后取最大值



import java.util.Arrays;
import java.util.Scanner; 
public class Main {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int n = scan.nextInt();//n个路灯
int l = scan.nextInt();//街道的长度l
int[] coordinates = new int[n];//n个路灯的坐标
for(int i = 0 ; i < n ; i++){
coordinates[i] = scan.nextInt();
}
System.out.println(String.format("%.2f", getD(n , l , coordinates)));
}
scan.close();
    }


private static double getD(int n, int l, int[] coordinates) {
double min_d = 0;
int max_distance = Integer.MIN_VALUE;//保存两个路灯之间的最大间距
Arrays.sort(coordinates);//坐标数组排序,从小到大
//计算已知坐标数组中两个路灯之间的最大间距
for(int i = 1 ; i < n ; i++){
if(coordinates[i] - coordinates[i - 1] > max_distance){
max_distance = coordinates[i] - coordinates[i - 1];
}
}
//如果第1个灯的坐标不是从起点0开始,第n个灯的坐标不是在终点d结束,要保证灯光覆盖街头和街尾,将半径转化为直径
max_distance = Math.max(max_distance , 2 * Math.max(coordinates[0] - 0, l - coordinates[n - 1]));
min_d = max_distance / 2.0;
return min_d;
}


}

你可能感兴趣的:(java,华为)