2022华为机试真题 C++ 实现路灯照明
Posted MISAYAONE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022华为机试真题 C++ 实现路灯照明相关的知识,希望对你有一定的参考价值。
目录
题目
【路灯照明】
一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为a[i] ,每盏灯可以覆盖到的最远距离为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
思路
1:这个题目只要理解了还是比较简单的,由于两个路灯之间的距离可以分担照明,那么就说明拿出每两个路灯之间距离的一半取出最大值即可,这样就能保证灯光必须覆盖整条街。
2:特殊情况就是第一个和最后一个路灯距离起点和终点的距离不能减半。
核心考点
1:想明白保证灯光覆盖整条路要什么条件
2:可能出现小数,C++ 的小数还需要特殊处理一下
Code
// Online C++ compiler to run C++ program online
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
using namespace std;
int main()
// 灯的个数和距离
int n;
int l;
cin >> n >> l;
int num = n;
// 每个灯的坐标
vector<int> lamp_pos_array;
while (n)
n--;
int coord;
cin >> coord;
lamp_pos_array.push_back(coord);
//给灯的坐标从小到大排个序,以便求出相邻路灯的间距, 偷懒用下sort方法
sort(lamp_pos_array.begin(), lamp_pos_array.end());
//先初始化为第一个路灯到第二个路灯的距离
double max_dis = lamp_pos_array[1] - lamp_pos_array[0];
for (int i=1; i<num-1; i++)
if (max_dis < lamp_pos_array[i+1] - lamp_pos_array[i])
max_dis = lamp_pos_array[i+1] - lamp_pos_array[i];
double half_max_dis = max_dis / 2;
//判断特殊情况
if (lamp_pos_array[0] > half_max_dis)
half_max_dis = lamp_pos_array[0];
if (l - lamp_pos_array[num-1] > half_max_dis)
half_max_dis = l - lamp_pos_array[n-1];
cout << setiosflags(ios::fixed);
cout << setprecision(2) << half_max_dis <<endl;
return 0;
以上是关于2022华为机试真题 C++ 实现路灯照明的主要内容,如果未能解决你的问题,请参考以下文章
华为OD机试模拟题用 C++ 实现 - 路灯照明(2023.Q1)