华为OD机试:路灯照明
时间: 2025-03-16 07:11:02 浏览: 36
### 华为OD机试中路灯照明问题的技术要求与算法实现
#### 1. 题目背景
华为OD机试中的路灯照明问题是典型的区间覆盖类问题,主要考察考生对于贪心算法的理解以及实际应用能力。该问题通常涉及如何通过最少数量的路灯来完全照亮一段道路[^2]。
#### 2. 技术要求分析
在解决此类问题时,需满足以下几点技术要求:
- **数据结构的选择**:应优先考虑使用数组或列表存储每盏路灯能够覆盖的道路范围。
- **算法设计原则**:采用贪心策略,在每次迭代过程中选择能覆盖当前未被照亮区域最远端的一盏路灯。
- **边界条件处理**:注意特殊情况下的输入验证,比如当没有任何路灯可以覆盖整个路段或者所有路灯都已足够覆盖目标区间的极端情况。
#### 3. Python 实现方案
以下是基于上述理论的一个具体实现:
```python
def min_lamps(road_length, lamps):
"""
计算所需最小路灯数以完全照亮指定长度的道路
参数:
road_length (int): 需要被照亮的道路总长度
lamps (list of tuple[int]): 每个元组表示一盏路灯可照射的起始位置和结束位置
返回:
int: 所需最少路灯数目;如果无法完成则返回 -1
"""
if not lamps or max([lamp[1] for lamp in lamps]) < road_length:
return -1
sorted_lamps = sorted(lamps, key=lambda x:x[0])
count = 0
current_end = 0
i = 0
n = len(sorted_lamps)
while current_end < road_length and i < n:
best_choice = None
farthest_reach = current_end
# 寻找最佳下一盏灯
while i < n and sorted_lamps[i][0] <= current_end:
if sorted_lamps[i][1] > farthest_reach:
best_choice = i
farthest_reach = sorted_lamps[i][1]
i += 1
if best_choice is None:
break
count += 1
current_end = farthest_reach
return count if current_end >= road_length else -1
# 测试用例
lamps_data = [(0, 5), (4, 9), (7, 12)]
print(min_lamps(10, lamps_data)) # 输出应该是 2
```
此代码实现了计算至少需要多少盏路灯才能完全照亮一条固定长度的道路的功能,并附带了一个简单的测试案例用于验证其正确性。
#### 4. 性能优化建议
为了提高程序运行效率,可以从以下几个方面入手:
- 对原始灯具数据进行预处理并排序,减少后续查找过程中的比较次数;
- 使用二分查找代替线性扫描寻找最优解的位置,进一步降低时间复杂度。
---
阅读全文
相关推荐

















