zoukankan      html  css  js  c++  java
  • 基本算法思维——路灯问题

    问题:

    V先生有一天工作到很晚,回家的时候要穿过一条长l的笔直的街道,这条街道上有n个路灯。假设这条街起点为0,终点为l,第i个路灯坐标为ai。路灯发光能力以正数d来衡量,其中d表示路灯能够照亮的街道的点与路灯的最远距离,所有路灯发光能力相同。为了让V先生看清回家的路,路灯必须照亮整条街道,又为了节省电力希望找到最小的d是多少?

    解决思路:实质是寻找最大间隔值

    (1)边界:如果街道开始或结尾处没有安置路灯,间隔值为第一个路灯的值或最后一个路灯距离街尾的值。

    (2)中间路灯:找到间隔最远的路灯,最后结果需要减半,因为此距离是两个路灯共同辐射的距离。

    (3)综合前两种情况,取大。

    code:

     1 import java.util.Arrays;
     2 import java.util.Scanner;
     3 public class Main {
     4     public static void main(String args[]) {
     5         Scanner s = new Scanner(System.in);
     6         int lamp_count = s.nextInt();
     7         int street_len = s.nextInt();
     8         int ar[] = new int[lamp_count];
     9         for(int i=0;i<lamp_count;i++) {
    10             ar[i] = s.nextInt();
    11         }
    12         //对路灯位置进行升序排序
    13         Arrays.parallelSort(ar);
    14         
    15         double dif = 0;
    16         //检查街道开始位置是否存在路灯
    17         if(ar[0]!=0) {
    18             dif=ar[0];
    19         }
    20         //检查街道末尾位置是否存在路灯
    21         if(ar[lamp_count-1]!=street_len) {
    22             dif = (street_len - ar[lamp_count-1])-dif>0?street_len - ar[lamp_count-1]:dif;
    23         }
    24         //检查中间路灯之间的间隔,
    25         for(int i=1;i<lamp_count;i++) {
    26             double res = ar[i]-ar[i-1];
    27             if((res/2)>dif) {
    28                 dif =res/2;
    29             }
    30         }
    31         s.close();
    32         System.out.printf("%.2f",dif);
    33     }
    34 
    35 }
  • 相关阅读:
    【CF875E】Delivery Club 二分+线段树
    【CF316G3】Good Substrings 后缀自动机
    【BZOJ3413】匹配 离线+后缀树+树状数组
    【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) 平衡树维护笛卡尔树+扫描线
    【BZOJ5133】[CodePlus2017年12月]白金元首与独舞 矩阵树定理
    【LOJ6254】最优卡组 堆(模拟搜索)
    面试问题总结
    Nginx基本配置
    Visual Studio Enterprise 2015下载 Update3
    .net 中生成二维码的组件
  • 原文地址:https://www.cnblogs.com/dream-flying/p/12780468.html
Copyright © 2011-2022 走看看