【原创】【算法】路灯


题目原文来自: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 }

相关