理想火车站定位

40 阅读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. 计算曼哈顿距离:对于两个点 (x1, y1)(x2, y2),曼哈顿距离为 |x1 - x2| + |y1 - y2|
  2. 遍历所有火车站位置:对于每个火车站位置,计算它到所有市民的总距离。
  3. 选择最优位置:选择总距离最小的火车站位置。如果有多个位置的总距离相同,选择第一次出现的位置。

代码提示

以下是代码的框架,其中关键步骤用注释标出:

def solution(n, m, citizens, locations):
    # 初始化最小距离为一个很大的值
    min_distance = float('inf')
    # 初始化最优位置为 [-1, -1]
    best_location = [-1, -1]
    
    # 遍历所有火车站位置
    for loc in locations:
        # 计算当前位置到所有市民的总距离
        total_distance = 0
        for citizen in citizens:
            # 计算曼哈顿距离并累加
            total_distance += abs(loc[0] - citizen[0]) + abs(loc[1] - citizen[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])

关键步骤解释

  1. 初始化最小距离:使用 float('inf') 表示一个很大的值,确保任何实际距离都会小于这个初始值。
  2. 遍历所有火车站位置:使用 for loc in locations 遍历每个可能的火车站位置。
  3. 计算总距离:对于每个火车站位置,遍历所有市民,计算曼哈顿距离并累加。
  4. 更新最优位置:如果当前总距离小于之前的最小距离,更新最小距离和最优位置。