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

Pythonでn個のボールからランダムに選択されたk個のボールから最大要素と最小要素の差の合計を見つけるプログラム


配列numsで番号が付けられたn個のボールがあり、そのサイズはnであり、nums[i]はボールiの数を表しているとします。ここで、別の値kがあります。各ターンで、n個の異なるボールからk個のボールを選び、k個のボールの最大値と最小値の差を見つけて、その差をテーブルに保存します。次に、これらのk個のボールを再びそのポットに入れ、可能なすべての選択肢が選択されるまでもう一度ピックします。最後に、表からすべての差の合計を見つけます。答えが大きすぎる場合は、結果mod 10 ^ 9+7を返します。

したがって、入力がn =4 k =3 nums =[5、7、9、11]の場合、組み合わせは-

であるため、出力は20になります。
  • [5,7,9]、差9-5 =4
  • [5,7,11]、差11-5 =6
  • [5,9,11]、差11-5 =6
  • [7,9,11]、差11-7 =4

したがって、4 + 6 + 6 + 4=20です。

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

  • m:=10 ^ 9 + 7
  • inv:=要素[0、1]を含む新しいリスト
  • 2からnの範囲のiについては、
    • invの最後に(m-(m / i)* inv [m mod i] mod m)のフロアを挿入します
  • comb_count:=1
  • res:=0
  • 範囲k-1からn-1のピックの場合、do
    • res:=res +(nums [pick] --nums [n --1 --pick])* comb_count mod m
    • res:=res mod m
    • comb_count:=comb_count *(pick + 1)mod m * inv [pick + 2-k] mod m
  • return res

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

def solve(n, k, nums):
   m = 10**9 + 7

   inv = [0, 1]
   for i in range(2, n + 1):
      inv.append(m - m // i * inv[m % i] % m)

   comb_count = 1
   res = 0
   for pick in range(k - 1, n):
      res += (nums[pick] - nums[n - 1 - pick]) * comb_count % m
      res %= m
      comb_count = comb_count * (pick + 1) % m * inv[pick + 2 - k] % m

   return res

n = 4
k = 3
nums = [5, 7, 9, 11]
print(solve(n, k, nums))

入力

4, 3, [5, 7, 9, 11]

出力

20

  1. Pythonでツリーのすべての要素の合計を見つけるプログラム

    いくつかの値を含む二分木があるとすると、ツリー内のすべての値の合計を見つける必要があります。 したがって、入力が次のような場合 その場合、出力は14になります これを解決するには、次の手順に従います- 関数recurse()を定義します。これはノードを取ります val:=ノードの値 ノードの左側がnullでない場合、 val:=val + recurse(ノードの左側) ノードの権利がnullでない場合、 val:=val + recurse(ノードの右側) 戻り値 メインの方法から、次のようにします- ルートがゼロ以外

  2. リスト内の要素の合計を見つけるPythonプログラム

    この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 入力としてリストが与えられた場合、与えられたリストの合計を計算する必要があります。 ここでは、考慮すべき2つのアプローチがあります。つまり、組み込み関数を使用する方法と、ブルートフォースアプローチを使用する方法です。 アプローチ1-組み込み関数の使用 例 # main arr = [1,2,3,4,5] ans = sum(arr) print ('Sum of the array is ',ans) 出力 15 すべての変数と関数はグローバルスコープで宣言されて