使用Python查找房屋和最近邮箱之间的最小总距离的程序

使用Python查找房屋和最近邮箱之间的最小总距离的程序

假设有一个名为houses的数组和另一个值k。这里的houses[i]表示第i个房子沿着街道的位置,我们必须在街道上分配k个邮箱,并找到每个房子和其最近邮箱之间的最小总距离。

因此,如果输入如下:houses = [6,7,9,16,22] k = 2,则输出将为9,因为如果我们在7和18处放置邮箱,那么从每个房屋到最近的邮箱的最小总距离是|6-7|+|7-7|+|9-7|+|16- 18|+|22-18| = 1+0+2+2+4=9。

为了解决此问题,我们将采取以下步骤−

  • 对houses列表进行排序

  • 定义一个函数util()。这将采取idx、n、k

  • 如果k与1相同,则

    • 内核:=房屋[(n+idx)/2的商]

    • 返回范围idx到n的每个i [|houses[i] – core|的元素之和])

  • result:=无穷大

  • 对于i范围idx到n,做到

    • 如果n-i < k-1,则
      • 从循环中退出
    • result:=最小值的结果和util(idx,i,1) + util(i+1,n,k – 1)

  • 返回结果

  • 从主方法做如下操作:

  • 返回util(0,houses的大小-1,k)

示例

让我们看一下以下实现,以获得更好的理解

def solve(houses, k):
   houses.sort()
   def util(idx, n, k):
      if k == 1:
         core = houses[(n + idx) // 2]
         return sum([abs(houses[i] - core) for i in range(idx, n + 1)])
      result = float('inf')
      for i in range(idx, n + 1):
         if n - i < k - 1:
            break
         result = min(result, util(idx, i, 1) + util(i+1, n, k - 1))
      return result
   return util(0, len(houses) - 1, k)

houses = [6,7,9,16,22]
k = 2
print(solve(houses, k))

输入

[6,7,9,16,22],2

输出

9

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程