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

1 阅读4分钟

问题描述

小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个备选的火车站位置。 如果有多个火车站最优,那么选择第一次出现的那个。

题目分析

本题的目的是帮助A市市长小F选择一个最优火车站建设位置,使得全市居民到火车站的总旅行时间最短。具体要求如下:

距离定义:采用曼哈顿距离计算,即从点 [𝑥1,𝑦1]到点[𝑥2,𝑦2]的距离为∣𝑥1−𝑥2∣+∣𝑦1−𝑦2∣ 输入参数

  • N:市民总人数。
  • M:可建设火车站的备选位置数。
  • citizens:市民住址的列表,每个元素是一个二维元组 (𝑥𝑖,𝑦𝑖)。
  • locations:备选火车站地址的列表,每个元素是一个二维元组 (𝑝𝑖,𝑞𝑖)。 输出要求:返回一个二维元组,表示最优火车站位置。如果存在多个候选位置使得总距离相同,则返回列表中第一个出现的位置。

解题思路

核心目标:

  • 选择一个火车站建设位置,使得居民到火车站的曼哈顿距离总和最小。

实现步骤:

  • 计算距离:使用曼哈顿距离公式 ∣𝑥1−𝑥2∣+∣𝑦1−𝑦2∣计算市民与火车站之间的距离。
  • 遍历备选点:依次遍历所有火车站备选点,计算每个点到所有市民的距离总和。
  • 记录最优结果:如果某个位置的总距离比当前最优值小,则更新最优值及最优位置。如果总距离相等,则保留列表中靠前的点。
  • 返回结果:最终输出最优火车站位置。

时间复杂度分析:

  • 外层遍历所有备选点 𝑀。
  • 内层计算每个点到 𝑁个市民的距离总和。
  • 总时间复杂度为 𝑂(𝑀×𝑁)。

实现代码

def solution(n, m, citizens, locations):
    def manhattan_distance(p1, p2):
        return abs(p1[0] - p2[0]) + abs(p1[1] - p2[1])
    
    min_distance = float('inf')  # 初始化最小距离为无穷大
    best_location = None  # 初始化最优位置为空
    
    # 遍历所有备选火车站位置
    for location in locations:
        # 计算当前位置到所有市民的距离总和
        total_distance = sum(manhattan_distance(location, citizen) for citizen in citizens)
        # 如果找到更小的总距离,则更新最优位置
        if total_distance < min_distance:
            min_distance = total_distance
            best_location = location
    
    return best_location

辅助函数:

定义 manhattan_distance 函数,计算两个点的曼哈顿距离,简洁明了。

初始化:

min_distance 设为无穷大,用于记录目前的最小距离总和。 best_location 初始化为空,记录当前的最优位置。

双层循环:

外层遍历 locations 列表中的每个备选火车站位置。 内层使用列表推导式计算当前火车站位置到所有市民的距离总和。

更新逻辑:

如果当前火车站的总距离小于 min_distance,更新最优位置及最小距离。 保证按顺序返回最优火车站点。

返回结果:

返回最优火车站位置。

总结与展望

总结:

  1. 该代码实现了题目要求的核心功能,逻辑清晰,代码简洁。
  2. 曼哈顿距离的计算公式被封装为一个辅助函数,增强了代码的可读性与复用性。
  3. 在遍历备选点时,始终保证按顺序记录第一个最优解,满足题目要求。

可能的改进:

优化性能:

  • 在 𝑀 和 𝑁 较大的情况下,时间复杂度𝑂(𝑀×𝑁)可能不够高效,可以考虑空间划分或其他数学优化方法(如分治法)。

扩展功能:

  • 如果未来需要支持多个火车站建设点,则需要调整算法,比如结合动态规划或聚类算法实现多点选址。

边界情况处理:

  • 确保输入数据合法性(如空列表、重复点等),增强代码的鲁棒性。

展望:

该算法可以进一步推广到实际应用中,例如城市规划中的垃圾回收站选址、配送中心建设等问题。通过引入更多约束条件(如建设成本、地理限制),结合线性规划或机器学习算法,可以实现更复杂的选址优化。