理想火车站定位| 豆包MarsCode AI刷题

75 阅读3分钟

小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 个备选的火车站位置。

如果有多个火车站最优,那么选择第一次出现的那个。


测试样例

样例1:

输入:n = 4,m = 3,citizens = [[-1, -1], [-1, 1], [1, -1], [1, 1]],locations = [[3, 2], [1, 0], [0, 0]]
输出:[1, 0]

样例2:

输入:n = 2,m = 2,citizens = [[0, 0], [0, 4]],locations = [[0, 2], [0, 3]]
输出:[0, 2]

样例3:

输入:n = 3,m = 1,citizens = [[10, 10], [20, 20], [30, 30]],locations = [[15, 15]]
输出:[15, 15]

样例4:

输入:n = 5,m = 3,citizens = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]],locations = [[4, 5], [6, 7], [8, 9]]
输出:[4, 5]

样例5:

输入:n = 6,m = 2,citizens = [[10, 10], [20, 20], [30, 30], [40, 40], [50, 50], [60, 60]],locations = [[35, 35], [45, 45]]
输出:[35, 35]

代码

` def solution(n, m, citizens, locations): # 初始化最小总距离为正无穷,最优位置为空 min_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_distance:
        min_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]) # 输出: True

citizens2 = [[0, 0], [0, 4]]
locations2 = [[0, 2], [0, 3]]
print(solution(2, 2, citizens2, locations2) == [0, 2])  # 输出: True

citizens3 = [[10, 10], [20, 20], [30, 30]]
locations3 = [[15, 15]]
print(solution(3, 1, citizens3, locations3) == [15, 15])  # 输出: True

citizens4 = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
locations4 = [[4, 5], [6, 7], [8, 9]]
print(solution(5, 3, citizens4, locations4) == [4, 5])  # 输出: True

citizens5 = [[10, 10], [20, 20], [30, 30], [40, 40], [50, 50], [60, 60]]
locations5 = [[35, 35], [45, 45]]
print(solution(6, 2, citizens5, locations5) == [35, 35])  # 输出: True

思路

  1. 初始化

    • 设置一个变量min_distance为正无穷大,用于记录当前找到的最小总距离。
    • 设置一个变量best_location为空,用于记录对应最小总距离的最佳火车站位置。
  2. 遍历候选位置

    • 对于locations中的每一个候选火车站位置loc,计算所有市民到该位置的曼哈顿距离总和。
  3. 计算曼哈顿距离

    • 对于citizens中的每一位市民citizen,计算其到当前候选火车站位置loc的曼哈顿距离,即|citizen[0] - loc[0]| + |citizen[1] - loc[1]|
    • 将所有市民到当前候选位置的曼哈顿距离累加,得到total_distance
  4. 更新最小距离和最佳位置

    • 如果当前候选位置的total_distance小于已知的min_distance,则更新min_distance为当前total_distance,并更新best_location为当前候选位置loc
  5. 返回结果

    • 遍历完所有候选位置后,返回best_location作为最佳火车站位置。