一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为ai ,每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要使这个d最小,请找到这个最小的d。
#include<iostream>
#include<iomanip>
#include<vector>
#include<algorithm>
using namespace std;
/*
思路:先将路灯坐标排序,找出两个路灯的最大间隔maxGap。
特别注意还得对两端特别处理,考虑到若街道两端没有路灯,则添加首端距离startGap和末端距离endGap。
中间路灯maxGap向两边发散灯光,所以照明范围是maxGap/2.0;端点处路灯只向一端发散,所以照明范围是max(startGap,endGap).
比较这两个发散距离,取大的一个输出。
同时题目要求保留两位小数,c++中添加头文件<iomanip>,使用fixed和setprecision(2)即可。
*/
int main()
{
int n, l;
while (cin>>n>>l)
{
vector<int> lamp(n);
for (int i = 0; i < n; i++)
{
cin >> lamp[i];
}
sort(lamp.begin(), lamp.end());
//首端和末端距离
int startGap=lamp[0]-0,endGap=l-lamp[n-1];
//计算中间最大距离
int maxGap=0;
for (int i = 0; i < n-1; i++)
{
int gap = lamp[i + 1] - lamp[i];
if (maxGap < gap)
maxGap = gap;
}
//比较两个灯光发散范围maxGap/2.0和max(startGap, endGap),输出结果
if (maxGap/2.0 <= max(startGap, endGap))
{
maxGap = max(startGap, endGap);
//注意c++中输出指定位数小数方法
cout << fixed << setprecision(2) << maxGap/1.0 << endl;
}
else
{
cout << fixed << setprecision(2) << maxGap / 2.0 << endl;
}
}
return 0;
}
京公网安备 11010502036488号