题目理解
-
问题背景:
- 小F是A市的市长,计划在A市新建一个火车站以方便市民的日常出行。
- 市区内的街道布局十分规整,形成网格状。
- 从一个位置
[x1, y1]到另一个位置[x2, y2]的距离计算方法为|x1 - x2| + |y1 - y2|,即曼哈顿距离。
-
目标:
- 选出一个最优位置作为火车站的地址,使得市民到火车站的总旅行时间最短。
输入输出
-
输入:
N: 市民的总人数。M: 可建设火车站的备选位置数。citizens: 一个列表,每个元素是一个元组[x_i, y_i],表示第i位市民的居住位置。locations: 一个列表,每个元素是一个元组[p_i, q_i],表示第i个备选的火车站位置。
-
输出:
- 返回一个列表
[p_i, q_i],表示最优的火车站位置。
- 返回一个列表
解题思路
-
理解曼哈顿距离:
- 曼哈顿距离的计算公式是
|x1 - x2| + |y1 - y2|。 - 这意味着从一个点到另一个点的距离是两个坐标差值的绝对值之和。
- 曼哈顿距离的计算公式是
-
目标:
- 我们需要找到一个火车站的位置,使得所有市民到这个火车站的总距离最小。
-
计算总距离:
- 对于每一个备选的火车站位置,计算所有市民到这个位置的总距离。
- 选择总距离最小的那个位置作为最优位置。
-
数据结构:
- 使用列表来存储市民和火车站的位置。
- 使用循环来遍历每一个备选位置,并计算总距离。
代码实现
def solution(n, m, citizens, locations):
# 初始化最小总距离为一个很大的值
min_total_distance = float('inf')
best_location = [-1, -1]
# 遍历每一个备选的火车站位置
for loc in locations:
total_distance = 0
# 计算所有市民到这个位置的总距离
for citizen in citizens:
total_distance += abs(citizen[0] - loc[0]) + abs(citizen[1] - loc[1])
# 如果当前总距离小于最小总距离,更新最小总距离和最优位置
if total_distance < min_total_distance:
min_total_distance = total_distance
best_location = loc
return best_location
if __name__ == "__main__":
# 你可以添加更多测试用例
citizens1 = [[-1, -1], [-1, 1], [1, -1], [1, 1]]
locations1 = [[3, 2], [1, 0], [0, 0]]
print(solution(4, 3, citizens1, locations1) == [1, 0])
代码解释
-
初始化:
min_total_distance初始化为一个很大的值(float('inf')),表示当前最小的总距离。best_location初始化为[-1, -1],表示当前最优的火车站位置。
-
遍历备选位置:
- 对于每一个备选的火车站位置
loc,初始化total_distance为 0。 - 遍历每一个市民的位置
citizen,计算该市民到loc的曼哈顿距离,并累加到total_distance。
- 对于每一个备选的火车站位置
-
更新最优位置:
- 如果当前的总距离
total_distance小于min_total_distance,则更新min_total_distance和best_location。
- 如果当前的总距离
-
返回结果:
- 最后返回
best_location,即最优的火车站位置。
- 最后返回
总结
-
关键点:
- 理解曼哈顿距离的计算方法。
- 遍历所有备选位置,计算每个位置的总距离。
- 选择总距离最小的位置作为最优位置。
-
优化:
- 如果
M和N非常大,可以考虑优化计算总距离的方法,例如使用更高效的数据结构或算法。
- 如果