题目描述V先生有一天工作到很晚,回家的时候要穿过一条长l的笔直的街道,这条街道上有n个路灯。假设这条街起点为0,终点为l,第i个路灯坐标为ai。路灯发光能力以正数d来衡量,其中d表示路灯能够照亮的街道上的点与路灯的最远距离,所有路灯发光能力相同。为了让V先生看清回家的路,路灯必须照亮整条街道,又为了节省电力希望找到最小的d是多少?
输入
输入两行数据,第一行是两个整数:路灯数目n (1≤n≤1000),街道长度l (1 ≤l≤109)。第二行有n个整数ai (0 ≤ ai≤ l),表示路灯坐标,多个路灯可以在同一个点,也可以安放在终点位置。 |
样例输入
7 15 15 5 3 7 9 14 0 |
输出
输出能够照亮整个街道的最小d,保留两位小数。 |
样例输出
2.50 |
import java.math.BigDecimal;
import java.util.Arrays;
/**
* 题目描述
* V先生有一天工作到很晚,回家的时候要穿过一条长l的笔直的街道,这条街道上有n个路灯。
* 假设这条街起点为0,终点为l,第i个路灯坐标为ai。路灯发光能力以正数d来衡量,其中d表示路灯能够照亮的街道上的点与路灯的最远距离,
* 所有路灯发光能力相同。为了让V先生看清回家的路,路灯必须照亮整条街道,又为了节省电力希望找到最小的d是多少?
*
* 输入:
* 【样例输入:7 15
* 15 5 3 7 9 14 0】
* 输入两行数据,第一行是两个整数:路灯数目n (1≤n≤1000),街道长度l (1 ≤l≤109)。
* 第二行有n个整数ai (0 ≤ ai≤ l),表示路灯坐标,多个路灯可以在同一个点,也可以安放在终点位置。
*
* 输出:
* 【样例输出:2.50】
* 输出能够照亮整个街道的最小d,保留两位小数。
* @author xiaowei 2017年11月17日 上午9:22:34
*/
public class Streetlights {
/*
* 一开始看题目描述没看懂,因为不知道那些东西是确定的,后面看了输入输出,结合样例才确定看懂。
* 题意:
* 求指定数组中,任意两位数差的最大值的一半。
*/
public static void main(String[] args) {
Streetlights streetlights = new Streetlights();
int[] a = { 15, 5, 3, 7, 9, 14, 0 };
try {
System.out.println(streetlights.getLightsRange(7, 15, a));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 计算半径d
* @param n,路灯个数
* @param l,街道长度
* @param a,街道上路灯的位置
* @throws Exception
*/
public float getLightsRange(int n, int l, int[] arr) throws Exception {
// 不知道入参n意义何在,a的长度完全可以替代n
if (arr == null || arr.length != n) {
throw new Exception("参数输入有误!");
}
int[] a = Arrays.copyOf(arr, arr.length);
// 升序
Arrays.sort(a);
int maxLen = 0;
for (int i = 1; i < a.length; i++) {
int tempLen = a[i] - a[i - 1];
if (tempLen > maxLen) {
maxLen = tempLen;
}
}
// 计算街道开始到第一个路灯的距离,及最后一个路灯到街道末尾的距离
int lastLen = l - a[a.length - 1];
// 多个三目运算一起时,从右往左进行运算
maxLen = a[0] > maxLen ? a[0] : lastLen > maxLen ? lastLen : maxLen;
BigDecimal result = new BigDecimal(String.valueOf(maxLen));
// 所求d为半径,故应除以2
return result.divide(new BigDecimal(String.valueOf(2))).floatValue();
}
}
输出结果:2.5