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

Pythonでちょうど2つのアイテムでおいしい食事を数えるプログラム


deli [i]がi番目の食品の美味しさである一連のデリがあるとすると、このリストから作成できるさまざまなおいしい食事の数を見つける必要があります。答えが大きすぎる場合は、10 ^ 9 + 7を法とする結果を返します。ここで、良い食事とは、2の累乗である美味しさの合計を持つ正確に2つの異なる食品を含む食事を意味します。おいしい食事を作るために、任意の2つの異なる食品を選択できます。

したがって、入力がdeli =[1,7,3,6,5]のようである場合、ペア(1,3)、(1,7)、および(3,5)を作成できるため、出力は3になります。合計は2の累乗です。

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

  • m:=10 ^ 9 + 7
  • count:=各美味しさの値の頻度を含むマップ
  • ans:=0
  • カウントされているアイテムiごとに、
    • 0〜21の範囲のnについては、
      • j:=(2 ^ n)-i
      • jがカウントされている場合、
        • iがjと同じ場合、
          • ans:=ans + count [i] *(count [i] -1)
        • それ以外の場合、
          • ans:=ans + count [i] * count [j]
  • (ans / 2)modmの商を返す

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

from collections import Counter
def solve(deli):
   m = 10**9 + 7
   count = Counter(deli)
   ans = 0
   for i in count:
      for n in range(22):
         j = (1<<n)-i
         if j in count:
            if i == j:
               ans += count[i] * (count[i]-1)
            else:
               ans += count[i] * count[j]
   return (ans // 2) % m

deli = [1,7,3,6,5]
print(solve(deli))

入力

[1,7,3,6,5]

出力

3

  1. PythonでnノードのBSTの数をカウントするプログラム

    n個の異なるノードがあるとします。すべてが異なります。二分探索木を形成するためにそれらを配置できる方法の数を見つける必要があります。二分探索木で知っているように、左側のサブツリーは常に小さい値を保持し、右側のサブツリーは大きい値を保持します。 これを解決するために、カタラン数を見つけます。カタラン数C(n)は、n個の異なるキーを持つ二分探索木を表します。式は次のようになります $$ C(n)=\ frac {(2n)!} {(n + 1)!\ times n!} $$ したがって、入力がn =3の場合、出力は5になります。 これを解決するには、次の手順に従います- 関数ncr

  2. 配列内の反転をカウントするPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −リストが表示されます。必要な反転をカウントして表示する必要があります。 反転カウントは、配列をソートするために必要なステップ数をカウントすることによって取得されます。 次に、以下の実装のソリューションを見てみましょう- 例 # count def InvCount(arr, n):    inv_count = 0    for i in range(n):       for j in range(i + 1, n):