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

Pythonで不幸な友達の数を数えるプログラム


n(偶数)の異なる友達の設定のリストがあるとします。各人iについて、preferences[i]は好みの順にソートされた友達のリストを保持します。したがって、リストの前の友人は、リストの後半の友人よりも優先されます。各リストの友達には、0からn-1までの整数で番号が付けられています。すべての友達は異なるペアに分けられます。ここで、pairs [i] =[xi、yi]は、xiがyiとペアになっている、および/またはyiがxiとペアになっていることを表します。しかし、xがyとペアになっていて、vとペアになっている友人uが存在する場合、友人xは不幸ですが、-

  • xはyよりもuを優先し、
  • uはvよりもxを優先します。

不幸な友達の数を見つけなければなりません。

したがって、入力が設定のようである場合=[[1、2、3]、[3、2、0]、[3、1、0]、[1、2、0]]ペア=[[0、1] 、[2、3]]の場合、最初の友人は人1が人0とペアになっているが、人0よりも人3を好み、人3は人2よりも人1を好むため、最初の友人は不幸であるため、出力は2になります。人3は人2とペアになっていますが、人2よりも人1を優先し、人1は人0よりも人3を優先するためです。

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

  • グラフ:=グラフを作成するための隣接リスト、最初は空
  • ペアの各ペア(s、e)について、
    • 設定の各設定について、
      • prefがendと同じ場合、
        • ループから抜け出す
      • グラフ[s、設定]:=1
    • 環境設定[e]の各設定について、
      • prefがstartと同じ場合、
        • ループから抜け出す
      • グラフ[e、設定]:=1
  • 不幸:=0
  • ペアの各ペア(s、e)について、
    • グラフの各設定について、
      • graph [pref] [s]が空でない場合、
        • 不幸:=不幸+1
        • ループから抜け出す
    • グラフ[end]の各設定について、
        を実行します。
      • graph [pref] [e]が空でない場合、
        • 不幸:=不幸+1
        • ループから抜け出す
  • 不幸に戻る

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

from collections import defaultdict
def solve(preferences, pairs):
   graph = defaultdict(dict)
   for start, end in pairs:
      for pref in preferences[start]:
         if pref == end:
            break
         graph[start][pref] = 1
      for pref in preferences[end]:
         if pref == start:
            break
         graph[end][pref] = 1

   unhappy = 0

   for start, end in pairs:
      for pref in graph[start]:
         if graph[pref].get(start, None):
            unhappy += 1
            break
      for pref in graph[end]:
         if graph[pref].get(end, None):
            unhappy += 1
            break
   return unhappy

preferences = [[1, 2, 3], [3, 2, 0], [3, 1, 0], [1, 2, 0]]
pairs = [[0, 1], [2, 3]]
print(solve(preferences, pairs))
>

入力

[[1, 2, 3], [3, 2, 0], [3, 1, 0], [1, 2, 0]], [[0, 1], [2, 3]]

出力

2

  1. Pythonで合計がkであるパスの数をカウントするプログラム

    二分木と別の値kがあるとすると、合計がkになるサブ子パスへの一意のノードの数を見つける必要があります。 したがって、入力が次のような場合 k =5の場合、パスは[2、3]と[1、4] であるため、出力は2になります。 これを解決するには、次の手順に従います- count:=マップは最初にキー0の値1を保持します ans:=0、プレフィックス:=0 関数dfs()を定義します。これはノードを取ります ノードがnullでない場合、 プレフィックス:=プレフィックス+ノードの値 ans:=ans +(count [prefix --target]、これが利用できない場合は0にな

  2. Pythonで行列内の囲まれた島の数を数えるプログラム

    バイナリ行列があるとします。ここで、1は土地を表し、0は水を表します。私たちが知っているように、島は周囲が水に囲まれているグループ化された1のグループです。完全に囲まれた島の数を見つける必要があります。 したがって、入力が次のような場合 3つの島があるため、出力は2になりますが、そのうちの2つは完全に囲まれています。 これを解決するには、次の手順に従います- 関数dfs()を定義します。これにはi、jが必要です iとjが行列の範囲内にない場合、 Falseを返す matrix [i、j]が0と同じ場合、 Trueを返す matrix [i、j]:=0 a:=df