Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで家と最寄りのメールボックスの間の最小合計距離を見つけるプログラム


Housesという配列があり、別の値kがあるとします。ここで、houses [i]は、通りに沿ったi番目の家の場所を表します。通りにk個のメールボックスを割り当て、各家と最も近いメールボックスの間の最小合計距離を見つける必要があります。

したがって、入力がhouses =[6,7,9,16,22] k =2の場合、メールボックスを7と18に配置すると、各家からの最小合計距離は| 6になるため、出力は9になります。 -7 | + | 7-7 | + | 9-7 | + | 16- 18 | + | 22-18 | =1 + 0 + 2 + 2 + 4 =9

これを解決するには、次の手順に従います-

  • リストハウスを並べ替える

  • 関数util()を定義します。これにはidx、n、kが必要です

  • kが1と同じ場合、

    • コア:=家[(n + idx)/2の商]

    • [|houses[i]のすべての要素の合計を返す-コア| idxからnの範囲の各iに対して])

  • 結果:=無限大

  • idxからnの範囲のiの場合、実行

    • n --i

      • ループから出てきます

    • 結果:=結果の最小値とutil(idx、i、1)+ util(i + 1、n、k --1)

  • 結果を返す

  • メインの方法から、次の手順を実行します。

  • return util(0、家のサイズ-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

  1. Pythonの二分木で2つのノード間の距離を見つけるプログラム

    二分木が与えられ、二分木の2つのノード間の距離を見つけるように求められたとします。グラフのように2つのノード間のエッジを見つけ、エッジの数またはそれらの間の距離を返します。ツリーのノードは以下のような構造になっています- data : <integer value> right : <pointer to another node of the tree> left : <pointer to another node of the tree> したがって、入力が次のような場合 そして、その間の距離を見つけなければならないノードは2と8です。その場

  2. Pythonでノードと子孫の違いを見つけるプログラム

    二分木があるとすると、ノードとその子孫の間で最大の絶対差を見つける必要があります。 したがって、入力が次のような場合 その場合、最大の絶対差はノ​​ード8と1の間であるため、出力は7になります。 これを解決するには、次の手順に従います- 関数dfs()を定義します。これはノードを取ります ノードがnullでない場合、 正と負の無限大のリストを返す left:=dfs(ノードの左側) right:=dfs(ノードの右) res:=(left [0]、right [0]の最小値とノードの値、およびleft [1]、right [1]とノードの値の最大値)とのペア ans: