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

Pythonですべてのボールを各ボックスに移動するための最小操作数を見つけるプログラム


boxsというバイナリ文字列があるとします。boxes[i]は「0」はi番目のボックスが空であることを示し、「1」は1つのボールが含まれていることを示します。これで、1回の操作で、1つのボールをボックスから隣接するボックスに移動できます。そうすると、一部のボックスに複数のボールが入る場合があります。サイズnの配列回答を見つける必要があります。ここで、answer [i]は、すべてのボールをi番目のボックスに移動するために必要な操作の最小数です。

したがって、入力がboxs ="1101"のような場合、出力は[4、3、4、5]

になります。
  • すべてのボールを最初のボックスに入れるには、box2から1回の操作で、最後のボールから3回の操作で取得する必要があるため、合計4回の操作になります。

  • すべてのボールを2番目のボックスに配置するには、ボックス1から1回の操作で、最後のボールから2回の操作で取得する必要があるため、合計3回の操作になります。

  • すべてのボールを3番目のボックスに配置するには、box2から取得し、最後にそれぞれ1つの操作を実行し、box1から2つの操作を実行する必要があるため、合計4つの操作になります。

  • すべてのボールを最後のボックスに配置するには、3回の操作でbox1から、2回の操作でbox2から取得する必要があるため、合計5回の操作になります。

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

  • 左:=0、右:=0、距離:=0

  • 0からボックスのサイズまでの範囲のiの場合-1、実行

    • box[i]が"1"と同じ場合、

      • dist:=dist + i

      • iが0と同じ場合、

        • 左:=左+ 1

      • それ以外の場合

        • 右:=右+ 1

  • arr:=リストで、最初にdistをリストに入れます

  • 1からボックスのサイズまでの範囲のiの場合-1、実行

    • arr[i-1]+左-右をarrの最後に挿入

    • box[i]が"1"と同じ場合、

      • 左:=左+ 1

      • 右:=右-1

  • 到着を返す

理解を深めるために、次の実装を見てみましょう-

def solve(boxes):
   left = 0
   right = 0

   dist = 0
   for i in range(len(boxes)):
      if boxes[i] == "1":
         dist += i
         if i == 0:
            left += 1
         else:
            right += 1
   arr = [dist]
   for i in range(1, len(boxes)):
      arr.append(arr[i-1] + left - right)
      if boxes[i] == "1":
         left += 1
         right -= 1
   return arr

boxes = "1101"
print(solve(boxes))

入力

"1101"

出力

[4, 3, 4, 5]

  1. Pythonですべてのポイントを接続するための最小コストを見つけるためのプログラム

    (x、y)の形式のいくつかの点を持つpointsという配列があるとします。ここで、2つのポイント(xi、yi)と(xj、yj)を接続するコストは、それらの間のマンハッタン距離であり、式は| xi--xj|です。 + | yi--yj|。すべてのポイントを接続するための最小コストを見つける必要があります。 したがって、ここでの合計距離は(6 + 5 + 3 + 8)=22です。 これを解決するには、次の手順に従います- points_set:=範囲0からポイントのサイズ-1までの数値を保持する新しいセット ヒープ:=ペア(0、0)でヒープを作成します visited_node:

  2. Pythonを使用してすべてのノードに到達するための頂点の最小数を見つけるプログラム

    n個の頂点とノードに0からn-1までの番号が付けられた有向非巡回グラフがあるとします。グラフはエッジリストで表されます。ここで、edges [i] =(u、v)はノードuからノードv。グラフ内のすべてのノードに到達できる頂点の最小セットを見つける必要があります。 (頂点は任意の順序で返すことができます)。 したがって、入力が次のような場合 これらの2つの頂点は他のどの頂点からも到達できないため、出力は[0,2,3]になります。したがって、それらから開始すると、すべてをカバーできます。 これを解決するには、次の手順に従います- n:=エッジのサイズ all_nodes:=