题意
一条长为L的路,在n个不同的位置都放置了路灯,灯光半径相同,问半径至少为多少时灯光可以覆盖整条路。
那我们就先排序,使灯的位置是从路的一边依次排到另一边的
,然后求出两两挨着的灯之间距离的最大值,因为灯光半径相等,所以两盏灯之间的距离就是两盏灯灯光的半径之和(也就是一盏灯灯光的直径),就把这个值除以二记录下来。
然后,因为要求整个道路全部被灯光覆盖,所以把刚刚记录的那个值与路最两端的灯到路两端的距离做比较取最大值(因为路的两段不会发光,所以覆盖这两段的只能是最边上的灯的半径,因此不用再把这个值除以二)
最后代码
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 100010
using namespace std;
int main(){
int n;
double l,a[10010];
double w=0;
cin>>n>>l;
for(int i=1;i<=n;i++){
cin>>a[i];
}
a[n+1]=l;
a[0]=0;
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
w=max(w,a[i]-a[i-1]);
}
w=max(a[1],w/2);
w=max(l-a[n],w);
printf("%.9lf",w);
return 0;
}