网易2:路灯

一条长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;
}
全部评论

相关推荐

jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
11-27 12:43
已编辑
门头沟学院 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务