问题描述
小F是A市的市长,正在计划在A市新建一个火车站以方便市民的日常出行。市区内的街道布局十分规整,形成网格状。从一个位置[x1, y1]到另一个位置[x2, y2]的距离计算方法为 |x1 - x2| + |y1 - y2|,即曼哈顿距离。
在初步考察后,市政府列出了M个可能的火车站建设点。为了使得市民到火车站的总旅行时间最短,小F希望选出一个最优位置作为火车站的地址。
请你帮助小F计算出哪一个位置最适合建设新火车站。
N: 市民的总人数。M: 可建设火车站的备选位置数。citizens: 一个列表,每个元素是一个元组[x_i, y_i],表示第i位市民的居住位置。locations: 一个列表,每个元素是一个元组[p_i, q_i],表示第i个备选的火车站位置。
如果有多个火车站最优,那么选择第一次出现的那个。
解题思路
为了找到最适合建设新火车站的位置,我们需要计算每个备选位置到所有市民居住位置的总曼哈顿距离,并选择使得总距离最小的位置。具体步骤如下:
- 计算曼哈顿距离:对于每个备选位置
[p_i, q_i],计算它到所有市民[x_j, y_j]的曼哈顿距离,即|p_i - x_j| + |q_i - y_j|。 - 累加距离:对于每个备选位置,累加它到所有市民的曼哈顿距离,得到该位置的总距离。
- 选择最优位置:比较所有备选位置的总距离,选择总距离最小的位置作为最优位置。如果有多个位置的总距离相同且最小,选择第一次出现的那个位置。
代码详解
def solution(n, m, citizens, locations):
min_total_distance = float('inf')
optimal_location = None
for p, q in locations:
total_distance = 0
for x, y in citizens:
total_distance += abs(p - x) + abs(q - y)
if total_distance < min_total_distance:
min_total_distance = total_distance
optimal_location = [p, q]
return optimal_location
if __name__ == "__main__":
# You can add more test cases here
citizens1 = [[-1, -1], [-1, 1], [1, -1], [1, 1]]
locations1 = [[3, 2], [1, 0], [0, 0]]
# solution(4, 3, citizens1, locations1)
print(solution(4, 3, citizens1, locations1) == [1, 0])
-
初始化最小的总距离
min_total_distance初始化为无穷大;初始化最优位置optimal_location为None。 -
对于每个备选位置
[p, q],初始化其与所有市民居住位置total_distance为 0。遍历所有市民的居住位置[x, y],计算曼哈顿距离并累加到total_distance。 -
如果当前备选位置的总距离
total_distance小于min_total_distance,则更新min_total_distance和optimal_location。这里要注意:为了满足条件“如果有多个火车站最优,那么选择第一次出现的那个”,所以total_distance小于min_total_distance是小于而不是total_distance小于等于min_total_distance。 -
最终返回最优的火车位置
optimal_location,即最优的火车站位置。
总结
上述问题可以分解为为计算曼哈顿距离、累加距离、选择最优位置等步骤。首先,使用列表来存储市民和备选位置的坐标,并通过for循环遍历列表来计算距离。之后,使用if条件判断来更新最优位置,确保在多个相同最小总距离的位置中选择第一次出现的那个。
在测试时要注意输出格式是[1, 0]而不是(1,0)。
解决这个问题使我们学会如何设计和实现一个简单的算法,熟悉基本的编程技巧和数据结构的使用。同时还要有问题分解、抽象、调试和测试的能力。