华为OD机考双机位B卷 - 路灯照明问题(Java & Python& JS & C/C++ & GO )

最新华为上机考试

真题目录:点击查看目录
华为OD面试真题精选:点击立即查看
2025华为od机试双机位B卷

题目描述

在一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间间距固定为100米。
每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。

输入描述

第一行为一个数N,表示路灯个数,1<=N<=100000
第二行为N个空格分隔的数,表示路灯的照明半径,1<=照明半径<=100000*100

输出描述

第一个路灯和最后一个路灯之间,无法照明的区间的长度和

示例1

输入

2
50 50

输出

0

说明

路灯1覆盖0-50,路灯2覆盖50-100,路灯1和路灯2之间(0米-100米)无未覆盖的区间。

示例2

输入

4
50 70 20 70

输出

20

说明

输入说明:
路灯1 覆盖0-50
路灯2 覆盖30-170
路灯3 覆盖180-220
路灯4 覆盖230-370
输出说明
[170,180],[220,230],两个未覆盖的区间,总里程为20

解题思路

这道题目是典型的区间合并问题,通过分析照明覆盖区间,计算未被覆盖的总长度。

问题理解

  • N个路灯按100米间距安装在公路上,位置分别为0, 100, 200, …, (N-1)*100
  • 每个路灯有照明半径,可照亮的范围是:[位置-半径, 位置+半径]
  • 需要计算第一个路灯和最后一个路灯之间无法照明的区间长度和

解题思路

  1. 构建每个路灯的照明区间

    • 对于第i个路灯,位置为i*100,照明半径为radius
    • 照明范围左端点:max(i*100 - radius, 0),不能小于0
    • 照明范围右端点:i*100 + radius
  2. 合并重叠区间

    • 将所有照明区间按照左端点排序
    • 如果当前区间与前一个合并区间重叠,则扩展前一个合并区间
    • 如果不重叠,则将前一个合并区间加入结果,并开始新的合并区间
  3. 计算未覆盖长度

    • 遍历合并后的区间列表
    • 相邻区间之间的间隔即为未覆盖的长度
    • 计算这些间隔的总
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值