🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
一、题目描述
1.1 输入描述
1.2 输出描述
1.3 测试样例
二、解题思路
三、代码实现
四、时间复杂度
注意:题目来源于网络用户分享,本文仅分享做题思路和方法,如有侵权请联系我删除!
一条长 l 的笔直的街道上有 n 个路灯,若这条街的起点为 0,终点为 l,第 i 个路灯坐标为 ai ,每盏灯可以覆盖到的最远距离为 d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要使这个 d 最小,请找到这个最小的 d。
每组数据第一行两个整数 n 和 l(n 大于 0 小于等于 1000,l 小于等于 1000000000 大于 0)。
第二行有 n 个整数(均大于等于 0 小于等于 l ),为每盏灯的坐标,多个路灯可以在同一点。
输出答案,保留两位小数。
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例。
输入
7 15
15 5 3 7 9 14 0
输出
2.50
在本题中,要使 d 最小,需要找到最大的间隔,此间隔的一半即是 d,需要注意的是:
(1)如果没有第 0 个路灯,那么,第一个路灯的间隔为第一个路径的坐标;
(2)如果最后一个路灯不等于 l,那么,最后一个路灯的间隔为长度 l 减去最后一个路灯的坐标;
代码实现如下所示。
#include
#include
#include
using namespace std;int main()
{int n, m;while (cin>>n>>m) {int val;vectorg;for (int i = 0; i < n; ++i) { // 获取输入cin>>val;g.push_back(val);}//sort 排序sort(g.begin(), g.end());int ans = g[0];for (int i = 1; i < n; ++i) { // 寻找最大间隔ans = max(ans, g[i] - g[i - 1]);}ans = max(ans, m - g[n - 1]); // 处理最后一棵树cout<
时间复杂度:O(nlogn)。
在上面代码中,时间主要消耗在排序上,排序时间复杂度为 O(nlogn), for 循环遍历的时间复杂度为 O(n),所以时间复杂度为 O(nlog)。
🎈 感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章」回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞