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

53 阅读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]] 即4位市民,3个火车站,对3个火车站,分别计算4位居民到火车站的总距离,得到结果为20,8和8,由于多个火车站最优选最早出现的,故最后输出:[1, 0]

样例2:

输入:n = 2,m = 2,citizens = [[0, 0], [0, 4]],locations = [[0, 2], [0, 3]] 即2位市民,2个火车站,对2个火车站,分别计算2位居民到火车站的总距离,得到结果为4和4,由于多个火车站最优选最早出现的,故最后输出:[0, 2]

样例3:

输入:n = 3,m = 1,citizens = [[10, 10], [20, 20], [30, 30]],locations = [[15, 15]]由于只有1个火车站,故最后输出:[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]] 即5位市民,3个火车站,对3个火车站,分别计算5位居民到火车站的总距离,最后输出:[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]] 即6位市民,2个火车站,对2个火车站,分别计算6位居民到火车站的总距离,最后输出:[35, 35]

解题思路

这个问题需要我们通过遍历所有可能的火车站位置,计算每个位置到所有市民的曼哈顿距离之和,然后选择总距离最小的位置作为最优火车站位置。

我们可以这么进行:

1、首先定义一个变量min_juli用来存储最小距离,并将其初始化为一个非常大的值float(inf),从而确保任何实际计算距离都会比这个小。

2、其次,我们遍历所有的备选火车站位置,内部嵌套一个for循环遍历所有的市民位置,计算该市民位置到备选火车站位置的曼哈顿距离,最后完成距离的累加。 3、更新最小距离,最终返回对应的最优位置。

完整代码如下:

def solution(n, m, citizens, locations):
    # Please write your code here
    min_juli = float("inf")
    for k in range(m):
        juli = 0
        for i in range(n):
            juli += abs(locations[k][0] - citizens[i][0]) + abs(locations[k][1] - citizens[i][1])
        if juli < min_juli:
            min_juli = juli
            index = k
    return locations[index]

运行代码,结果如下:

image.png

可以看到能够通过测试,当然这个算法的时间复杂度较高,如果数据量太大,可能需要考虑进一步优化。