【原创】【算法】路灯
题目原文来自:https://www.nowcoder.com/practice/62cdf520b9d94616b6644ac03a0306ff?tpId=182&&tqId=34276&rp=1&ru=/ta/exam-all&qru=/ta/exam-all/question-ranking
题目描述
一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为ai ,每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要使这个d最小,请找到这个最小的d。
输入描述:
每组数据第一行两个整数n和l(n大于0小于等于1000,l小于等于1000000000大于0)。第二行有n个整数(均大于等于0小于等于l),为每盏灯的坐标,多个路灯可以在同一点。
输出描述:
输出答案,保留两位小数。
解题思路:
1. 因为照明距离是相等的,可以推出:照明最短距离 = 间隔最长路灯距离的一半
2. 考虑边界值。对于第1盏灯和最后1盏灯,他们到路段的头和尾是没有路灯的。
3. 输出的时候需要格式化。
程序实现:
1. 输入后,利用Arrays.sort排序。
2. 计算出路灯与路灯之间的最长距离。
3. 比较(路灯间最长距离的一半)、(路段开始到第一个路灯)、(最后一个路灯到路段结束)的最大值。
4.格式化输出。
1 import java.text.DecimalFormat; 2 import java.util.ArrayList; 3 import java.util.Arrays; 4 import java.util.Scanner; 5 6 public class Main { 7 public static void main(String args[]){ 8 Scanner sc = new Scanner(System.in); 9 while (sc.hasNext()){ 10 int n = sc.nextInt(); 11 int l = sc.nextInt(); 12 int a[] = new int[n]; 13 for(int i=0;i){ 14 a[i] = sc.nextInt(); 15 } 16 Arrays.sort(a); 17 int maxLenth=0; 18 for(int i=n-1;i>0;i--){ 19 maxLenth = Math.max(maxLenth,a[i]-a[i-1]); 20 } 21 DecimalFormat decimalFormat = new DecimalFormat("##.00"); 22 if(Math.max(a[0],l-a[n-1])>(double)maxLenth/2){ 23 System.out.println(decimalFormat.format(Math.max(a[0],l-a[n-1]))); 24 }else { 25 System.out.println(decimalFormat.format((double)maxLenth/2)); 26 } 27 } 28 } 29 }