82.理想火车站定位解析

184 阅读4分钟

在本题中,市长小F正在规划在A市建设新的火车站,目标是为市民提供更好的交通便捷性。市区的街道布局非常规整,呈现网格状,因此市民与火车站之间的出行距离可以通过曼哈顿距离进行计算。曼哈顿距离是指在网格状街道中,两点间的距离等于它们在x轴和y轴上的距离之和。

题目解析

题目给定了多个备选的火车站建设位置,市长希望通过选择一个最优的建设位置,使得市民到达火车站的总旅行时间(曼哈顿距离之和)最短。具体而言,市长有多个候选的火车站位置,市民的居住位置已经给出,任务是计算出哪个位置最适合建设新火车站。

我们可以通过以下步骤解决这个问题:

  1. 输入格式

    • n:市民的总人数。
    • m:备选的火车站位置数量。
    • citizens:一个列表,包含市民的居住位置,每个市民的居住位置是一个二维坐标 [x_i, y_i]
    • locations:一个列表,包含火车站的候选位置,每个候选位置也是一个二维坐标 [p_i, q_i]
  2. 目标

    • 我们需要通过计算每个备选火车站位置到所有市民位置的曼哈顿距离之和,选出距离总和最小的火车站位置。如果有多个位置的总距离相同,则选择第一个出现的那个。
  3. 曼哈顿距离公式

    • 曼哈顿距离计算方式是两个点 (x1, y1)(x2, y2) 之间的距离为 |x1 - x2| + |y1 - y2|。这个公式非常直观,因为它表示从一个点到另一个点需要沿着水平和垂直方向分别移动的总步数。
  4. 解题思路

    • 对于每个备选的火车站位置,计算其到所有市民位置的曼哈顿距离,并将这些距离累加得到一个总距离。
    • 遍历所有备选位置,记录最小的总距离以及对应的火车站位置。
    • 最终返回那个使得市民总旅行时间最短的火车站位置。

代码实现

接下来是解题的Python代码实现:

def solution(n, m, citizens, locations):
    min_distance = float('inf')  # 初始化最小距离为正无穷
    best_location = None  # 最优火车站位置
    # 遍历所有的备选火车站位置
    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])  # 输出: True

代码解析

  1. 初始化

    • min_distance 被初始化为正无穷(float('inf')),用来记录当前遍历过程中最小的总曼哈顿距离。
    • best_location 用于存储当前最优火车站的位置。
  2. 遍历所有候选火车站位置

    • 外层 for 循环遍历所有的火车站候选位置。对于每个位置,我们计算该位置到所有市民的总曼哈顿距离。
  3. 计算曼哈顿距离

    • 对于每个市民,我们计算其与当前火车站位置的曼哈顿距离。曼哈顿距离的计算方式是 abs(loc[0] - citizen[0]) + abs(loc[1] - citizen[1]),这就是市民到火车站的出行步数。
  4. 更新最优位置

    • 如果当前火车站位置的总距离小于之前记录的 min_distance,则更新 min_distancebest_location
  5. 返回结果

    • 最终返回 best_location,即最适合建设火车站的位置。

复杂度分析

  • 时间复杂度:
    • 假设市民数量为 n,备选位置数量为 m。对于每个备选位置,需要计算它到每个市民的曼哈顿距离,因此时间复杂度为 O(n * m)。
  • 空间复杂度:
    • 只使用了少量额外的空间来存储最小距离和最佳位置,因此空间复杂度为 O(1)。

这种方法能够有效地解决问题,虽然它的时间复杂度是 O(n * m),但在题目给定的输入规模下,通常是可以接受的。

总结

通过上述方法,我们可以有效地选择出最适合建设火车站的位置。关键点在于对每个候选位置计算市民到火车站的曼哈顿距离之和,并通过比较选择最小的距离。该解法简单直接,适合于问题规模较小的情况。