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

プログラムは、Pythonで指定された条件を満たすカラフルな頂点のサブセットの数を見つけます


1つの正多角形の色を表す配列色があるとします。ここで、このn-gonの各頂点は、指定された配列に存在するn個の異なる色の1つでランダムに色付けされました。これらのサブセットがこれらの条件を満たすように、ポリゴン頂点の特別なサブセットの数を見つける必要があります-

  • サブセットのサイズは少なくとも2つである必要があります。
  • サブセットに存在する頂点をポリゴンから削除すると(これらの頂点の隣接するエッジも削除されます)、残りの頂点とエッジはいくつかの連続したパスを形成します。
  • これらのパスのいずれにも、同じ色の2つの頂点を含めることはできません。

そのようなサブセットの数を数える必要があります。答えが大きすぎる場合は、結果mod 10 ^ 9+7を返します。

したがって、入力がcolors =[1,2,3,4]の場合、出力は11になります。

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

  • count:=すべての値が空のリストになる空のマップ。
  • n:=色のサイズ
  • 0から色のサイズ-1までの範囲のiの場合、実行します
    • カウントの最後にiを挿入[colors[i]]
  • 回答:=0
  • 2からnの範囲のiについては、
    • 回答:=回答+ nCr(n、i)
  • カウントのすべてのキーのリストにある各iについて、
    • l0:=count [i]
    • n0:=l0のサイズ
    • n0> 1の場合、
      • 0からn0-2の範囲のiについては、
        • i +1からn0-1の範囲のjの場合、do
          • d1:=l0 [j] -l0 [i]
          • d2:=l0 [i] -l0 [j] + n
          • d1<=n-3またはd2<=n-3の場合、
            • 回答:=回答-1
  • 回答を返す

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

from collections import defaultdict
from math import factorial

def nCr(n, i):
   if n==1:
      return 1
   return factorial(n)//factorial(i)//factorial(n-i)

def solve(colors):
   count = defaultdict(list)
   n = len(colors)

   for i in range(len(colors)):
      count[colors[i]].append(i)
   answer = 0

   for i in range(2, n+1):
      answer += nCr(n, i)

   for i in count.keys():
      l0 = count[i]
      n0 = len(l0)

      if n0 > 1:
         for i in range(n0-1):
            for j in range(i+1, n0):
               d1 = l0[j] -l0[i]
               d2 = l0[i] -l0[j] + n
               if d1 <= n-3 or d2<= n-3:
                  answer -=1

   return answer

colors = [1,2,3,4]
print(solve(colors))

入力

[1,2,3,4]

出力

11

  1. Pythonで特定のエッジを含む一意のパスの数をカウントするプログラム

    (u、v)の形式のエッジのリストがあり、これらがツリーを表しているとします。エッジごとに、入力で指定されたのと同じ順序で、そのエッジを含む一意のパスの総数を見つける必要があります。 したがって、入力がエッジのような場合=[[0、1]、[0、2]、[1、3]、[1、4]] その場合、出力は[6、4、4、4]になります。 これを解決するには、次の手順に従います- adj:=指定されたエッジからの隣接リスト count:=空のマップ 関数dfs()を定義します。これにはx、親が必要です count [x]:=1 adj [x]のnbごとに、実行 n

  2. Pythonでマージした後も、最小数の色を見つけるプログラムが残っています

    色のリスト(R、G、B)があるとします。これで、2つの異なる色が隣り合っている場合、それらは3番目の色の単一の色のアイテムに変換できます。そのような変換の可能なシーケンスの後に残っているそれらの最小数を見つける必要があります。 したがって、入力がcolors =[G、 R、 G、 B、 R]の場合、以下のように変換できるため、出力は1になります- これを解決するには、次の手順に従います- n:=色のサイズ 色に異なる色が1つしかない場合は、 return n n <=1の場合、 return n x:=0 d:=キーと値のペアを持つマップ{( R、1)、(