一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为ai ,每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要使这个d最小,请找到这个最小的d。
每组数据第一行两个整数n和l(n大于0小于等于1000,l小于等于1000000000大于0)。第二行有n个整数(均大于等于0小于等于l),为每盏灯的坐标,多个路灯可以在同一点。
输出答案,保留两位小数。
7 15 15 5 3 7 9 14 0
2.50
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); int l = scanner.nextInt(); int[] lights = new int[n]; for (int i = 0; i < n; i++) { lights[i] = scanner.nextInt(); } Arrays.sort(lights); double ans = Math.max(lights[0], l - lights[n - 1]); for (int i = 1; i < n; i++) { double temp = (lights[i] - lights[i - 1]) / 2.0; ans = Math.max(ans, temp); } System.out.printf("%.2f%n", ans); } } }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); int l=sc.nextInt(); int[] light=new int[n]; for(int i=0;i<n;i++){ light[i]=sc.nextInt(); } Arrays.sort(light); double max=0.0; for(int i=1;i<n;i++){ max=Math.max(light[i]-light[i-1],max); } double res=0.0; res=Math.max(max/2.0,Math.max(light[0],l-light[n-1])); System.out.println(String.format("%.2f",res)); } } }
本文算法步骤:
解释:数组内间距除以2是因为两个灯同时照亮这一段距离,边界不除以2是因为边界位置没有灯,所以第一个灯和最后一个灯要负责照亮整个距离。
import java.util.*; import java.io.*; import java.text.*; public class Main{ public static void main(String[] args) throws IOException{ DecimalFormat df = new DecimalFormat("0.00"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line; String[] temp; while((line = br.readLine()) != null){ temp = line.split(" "); int num = Integer.parseInt(temp[0]); int len = Integer.parseInt(temp[1]); String[] str2 = br.readLine().split(" "); int[] locations = new int[num]; for(int i=0; i<num; i++){ locations[i] = Integer.parseInt(str2[i]); } int ans = 0; // 排序 算最大间距 然后除2得ans Arrays.sort(locations); for(int i=1; i<num; i++){ ans = Math.max(ans, locations[i]-locations[i-1]); } double minD = ans/2.0; minD = Math.max(minD, locations[0]); minD = Math.max(minD, len-locations[num-1]); System.out.println(df.format(minD)); } } }
/*注意起始坐标和终点坐标*/ import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int n = sc.nextInt(); long l = sc.nextLong(); PriorityQueue<Long> q = new PriorityQueue<>(); long max = 0; for(int i = 0; i < n; i++){ q.add(sc.nextLong()); } long cur = 0; long first = q.peek(); while(!q.isEmpty()){ max = Math.max(max, q.peek() - cur); cur = q.poll(); } long end = l - cur; if(Math.max(first, end) > max / 2) System.out.printf("%.2f", (float)Math.max(first, end)); else System.out.printf("%.2f", (float)max / 2); System.out.println(); } sc.close(); } }
import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); // 读取输入,直到没有整型数据可读 while(cin.hasNextInt()) { int n = cin.nextInt(); int l = cin.nextInt(); int[] arr = new int[n]; for(int i=0;i<n;i++) { arr[i] = cin.nextInt(); } //练习快排 quickSort(arr,0,arr.length-1); double max = 0.0; //整数相除要转类型 for(int i=1;i<n;i++) { max = Math.max(max,Double.valueOf((arr[i]-arr[i-1]))/2); } //边界距离不可忽视 max = Math.max(max, l-arr[n-1]); max = Math.max(max, arr[0]); String result = String.format("%.2f",max); System.out.println(result); } } public static void quickSort(int[] arr,int left,int right){ if(left>right) return; int i=left,j=right; int base = arr[left]; while(i!=j){ while(i<j && arr[j]>=base){ j--; } while(i<j && arr[i]<=base){ i++; } if(i<j){ int tmp = arr[j]; arr[j] = arr[i]; arr[i] = tmp; } } arr[left] = arr[j]; arr[j] = base; quickSort(arr,left,j-1); quickSort(arr,j+1,right); } }
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); long ll = sc.nextInt(); long[] map = new long[n]; for (int i = 0; i < n; i++) { map[i] = sc.nextLong(); } Arrays.sort(map); double max = map[0]; for (int i = 1; i < n; i++) { double d = 1.0 * (map[i] - map[i - 1]) / 2; max = max > d ? max : d; } max = max > (ll - map[n - 1]) ? max : (ll - map[n - 1]); System.out.println(String.format("%1$.2f", max)); } } }
import java.util.Scanner; import java.math.BigDecimal; public class Main{ public static void main(String[] args){ Scanner input = new Scanner(System.in); while(input.hasNext()){ int n = input.nextInt(); long l = input.nextLong(); long[] lump = new long[n]; for(int i = 0;i < n;i++){ lump[i] = input.nextLong(); } for(int i = 0;i < n -1;i++){ for(int j = 0;j < n-i-1;j++){ if(lump[j] > lump[j+1]){ long temp = lump[j]; lump[j] = lump[j+1]; lump[j+1] = temp; } } } long max = lump[1] - lump[0]; for(int i = 2;i < n;i++){ long current = lump[i] - lump[i - 1]; if(max < current) max = current; } max = ((lump[0]-0)*2 > max)?(lump[0]-0)*2 : max; max = ((l - lump[n-1])*2 > max)?(l - lump[n-1])*2 : max; double result = (double) max / 2; BigDecimal bigDecimal = new BigDecimal(result); System.out.println(bigDecimal.setScale(2)); } } }
import java.text.DecimalFormat; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); int l = sc.nextInt(); int[] arr = new int[n]; for (int i = 0; i < arr.length; i ++ ) { arr[i] = sc.nextInt(); } Arrays.sort(arr); double max = 0; for (int i = 1; i < arr.length; i ++ ) { max = max > arr[i] - arr[i - 1] ? max : arr[i] - arr[i - 1]; } max = max / 2; max = max > l - arr[n - 1] ? max : l - arr[n - 1]; // 右边界条件 max = max > arr[0] ? max : arr[0]; // 左边界条件 System.out.println(new DecimalFormat("0.00").format(max)); } sc.close(); } }
import java.util.Scanner; import java.text.DecimalFormat; import java.util.Arrays; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while(in.hasNext()){ int n = in.nextInt(); int l = in.nextInt(); long[] num = new long[n]; for(int i = 0;i<n;i++){ num[i] = in.nextInt(); } Arrays.sort(num); long max = 0; for(int i = 1;i<n;i++){ if(num[i]-num[i-1]>max) max = num[i]-num[i-1]; } long border = 2 * Math.max(l-num[n-1], num[0]); if (border > max) max = border; System.out.println(new DecimalFormat("0.00").format((float)max/2)); } } }
import java.util.Scanner; import java.text.DecimalFormat; public class StreetLamp { public static void sort(int []a,int n){ for(int i=0;i<n-1;i++) for(int j=0;j<n-i-1;j++){ if(a[j]>a[j+1]){ int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } public static void main(String []args){ Scanner sc = new Scanner(System.in); DecimalFormat df = new DecimalFormat("######0.00"); while(sc.hasNext()){ int n = sc.nextInt(); //n个路灯 long l = sc.nextInt(); //距离为l int []a = new int[n]; for(int i=0;i<n;i++) a[i] = sc.nextInt(); sort(a,n); double max = 2*a[0]; for(int i=0;i<n-1;i++){ int temp = a[i+1]-a[i]; if(max<temp) max = temp; } if(a[n-1]!=l){ if(max/2<l-a[n-1]){ max = l - a[n - 1]; System.out.println(df.format(max)); } else System.out.println(df.format(max/2)); } else System.out.println(df.format(max/2)); } } }
import java.text.DecimalFormat; import java.util.Scanner; /** * 一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为ai, * 每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街, * 但是为了省电,要是这个d最小,请找到这个最小的d。 * * 每组数据第一行两个整数n和l(n大于0小于等于1000,l小于等于1000000000大于0)。 * 第二行有n个整数(均大于等于0小于等于l),为每盏灯的坐标,多个路灯可以在同一点。 * @author kexun * */ public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int n = in.nextInt(); int i = in.nextInt(); int[] list = new int[n]; for (int j=0; j<n; j++) { list[j] = in.nextInt(); } sort(list); long maxDist = 0; for (int k=0; k<n-1; k++) { int temp = list[k+1] - list[k]; if (temp > maxDist) { maxDist = temp; } } DecimalFormat df = new DecimalFormat("0.00"); long result; long lastDist = (long) ((i-list[list.length-1])*1.0); long firstDist = (long) (list[0]*1.0); if (firstDist > lastDist) { result = firstDist; } else { result = lastDist; } if ((long) (maxDist/2.0) > result) { System.out.println(df.format(maxDist/2.0)); } else { System.out.println(df.format(result)); } } } public static void sort(int[] list) { int length = list.length; if (length <= 1) { return; } for (int i=0; i<length; i++) { for (int j=length-1; j>i; j--) { if (list[j] < list[j-1]) { int temp = list[j]; list[j] = list[j-1]; list[j-1] = temp; } } } } }