Pythonでバッグ内のボールの最小制限を見つけるプログラム
配列numsがあり、i番目の要素がnums[i]個のボールを含むバッグを示しているとします。 mxという別の値もあります。最大mx回で次の操作を実行できます-
-
ボールのバッグを選択し、少なくとも1つのボールが入った2つの新しいバッグに分割します。
-
ここでのペナルティは、バッグ内のボールの最大数です。
手術後のペナルティを最小限に抑える必要があります。したがって、最後に、操作を実行した後、可能な限り最小限のペナルティを見つける必要があります。
したがって、入力がnums =[4,8,16,4]、mx =4の場合、次の操作を実行できるため、出力は4になります。最初は[4,8,16,4]のようなバッグがあります。 、[4,8,8,8,4]のように16個のボールが付いたバッグを分割し、次に8個のボールが付いたバッグごとに4個のボールが付いた2個のバッグに分割すると、配列は[4,4,4、 8,8,4]、次に[4,4,4,4,4,8,4]、最後に[4,4,4,4,4,4,4,4]なので、ここでは最小で4つのボールがあります、それがペナルティです。
これを解決するには、次の手順に従います-
-
関数helper()を定義します。これはターゲットを取ります、mx
-
ターゲットが0と同じ場合、
-
mx+1を返す
-
-
カウント:=0
-
numsのnumごとに、実行します
-
count:=count +(num-1)/targetの商
-
-
リターンカウント<=mx
-
メインの方法から、次のようにします
-
left:=(numsのすべての要素の合計/(numsのサイズ+ mx))と1の商の最大値
-
右:=最大数
-
左<右、する
-
mid:=(左+右)/2の商
-
helper(mid、mx)がゼロ以外の場合、
-
右:=半ば
-
-
それ以外の場合
-
左:=半ば+ 1
-
-
-
左に戻る
例
理解を深めるために、次の実装を見てみましょう-
def helper(target, mx): if target == 0: return mx + 1 count = 0 for num in nums: count += (num - 1) // target return count <= mx def solve(nums, mx): left, right = max(sum(nums) // (len(nums) + mx), 1), max(nums) while left < right: mid = (left + right) // 2 if helper(mid, mx): right = mid else: left = mid + 1 return left nums = [4,8,16,4] mx = 4 print(solve(nums, mx))
入力
[4,8,16,4], 4
出力
4
-
Pythonでスティックをカットするための最小コストを見つけるためのプログラム
値nとcutsという配列があるとします。長さn単位の木の棒があると考えてください。スティックには0からnまでのラベルが付いています。ここで、cuts [i]は、カットできる位置を表します。順番にカットする必要がありますが、カットの順番は自由に変更できます。ここで、1カットのコストはカットするスティックのサイズであり、合計コストはすべてのカットのコストの合計です。削減の最小総コストを見つける必要があります。 したがって、入力がn =7、cuts =[5,1,4,3]の場合、出力は16になります。これは、[3,5,1,4]のように注文すると、最初に長さ7から3なので、コストは7です。次に、長さ3
-
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: