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

Pythonで同じ長さのk個のリボンの最大長を見つけるプログラム


リボンの長さを表す正の数のリストがあり、1つの値kもあるとします。リボンは何度でもカットできます。長さrのリボンをk個持つことができるように、最大​​の長さrを見つける必要があります。そのような解決策が見つからない場合は、-1を返します。

したがって、入力がribbons =[1、2、5、7、15] k =5の場合、サイズ15のリボンをそれぞれ長さ5の3つの部分にカットできるため、出力は5になります。次に、サイズ7のリボンをサイズ2と5にカットします。また、サイズ5のリボンがもう1つあるので、合計でサイズ5のリボンが5つ得られます。

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

  • 左:=0
  • 右:=リボンの最大数
  • 左<右、実行
    • mid:=フロア(左+右+ 1)/ 2
    • (少なくともkであるリボン内の各ribbonLenのribbonLenのフロア/ mid)を含むリストに存在するすべての要素の合計の場合、
      • 左:=中央
    • それ以外の場合、
      • 右:=半ば-1
  • 左がゼロ以外の場合、
    • 左に戻る
  • 戻り値-1

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

def solve(ribbons, k):
   left = 0
   right = max(ribbons)
   while left < right:
      mid = (left + right + 1) // 2
      if sum((ribbonLen // mid for ribbonLen in ribbons)) >= k:
         left = mid
      else:
         right = mid - 1
   if left:
      return left
   return -1

ribbons = [1, 2, 5, 7, 15]
k = 5
print(solve(ribbons, k))

入力

[1, 2, 5, 7, 15], 5

出力

5

  1. Pythonで同じ頻度の最大頻度要素を持つ最短サブリストの長さを見つけるプログラム

    numsという番号のリストがあるとします。 numsで最も頻繁な数の頻度がkである場合。最も頻度の高いアイテムの頻度もkになるように、最短のサブリストの長さを見つける必要があります。 したがって、入力がnums =[10、20、30、40、30、10]の場合、出力は3になります。これは、ここで最も頻度の高い数値が10と30であり、ここでk=2であるためです。サブリスト[30、40、30]これは、30が存在し、その頻度も2である最短のサブリストです。 これを解決するには、次の手順に従います- L:=numsのサイズ rnums:=numsの逆 d:=numsで存在する各要素の頻度を含

  2. Pythonで最大の建物の高さを見つけるプログラム

    値nと、制限と呼ばれるペアの別のリストがあるとします。都市にn棟の新しい建物を建てたいと思っています。ただし、制限はほとんどありません。私たちは一列に建てることができ、建物には1からnまでのラベルが付けられています。制限には2つのパラメーターがあるため、restrictions [i] =(id_i、max_height_i)は、id_iの高さがmax_height_i以下でなければならないことを示します。新しい建物の高さに関する市の制限は次のとおりです- 各建物の高さは0または正の値である必要があります。 最初の建物の高さは0でなければなりません。 隣接する2つの建物の高さ