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

41 阅读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. 计算曼哈顿距离:对于每个备选位置 [p_i, q_i],计算它到所有市民 [x_j, y_j] 的曼哈顿距离,即 |p_i - x_j| + |q_i - y_j|
  2. 累加距离:对于每个备选位置,累加它到所有市民的曼哈顿距离,得到该位置的总距离。
  3. 选择最优位置:比较所有备选位置的总距离,选择总距离最小的位置作为最优位置。如果有多个位置的总距离相同且最小,选择第一次出现的那个位置。

代码详解

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])
  1. 初始化最小的总距离min_total_distance 初始化为无穷大;初始化最优位置optimal_location 为 None

  2. 对于每个备选位置 [p, q],初始化其与所有市民居住位置 total_distance 为 0。遍历所有市民的居住位置 [x, y],计算曼哈顿距离并累加到 total_distance

  3. 如果当前备选位置的总距离 total_distance 小于 min_total_distance,则更新 min_total_distance 和 optimal_location。这里要注意:为了满足条件“如果有多个火车站最优,那么选择第一次出现的那个”,所以total_distance 小于 min_total_distance是小于而不是total_distance 小于等于 min_total_distance

  4. 最终返回最优的火车位置 optimal_location,即最优的火车站位置。

总结

上述问题可以分解为为计算曼哈顿距离、累加距离、选择最优位置等步骤。首先,使用列表来存储市民和备选位置的坐标,并通过for循环遍历列表来计算距离。之后,使用if条件判断来更新最优位置,确保在多个相同最小总距离的位置中选择第一次出现的那个。

在测试时要注意输出格式是[1, 0]而不是(1,0)

解决这个问题使我们学会如何设计和实现一个简单的算法,熟悉基本的编程技巧和数据结构的使用。同时还要有问题分解、抽象、调试和测试的能力。