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

Pythonのすべての異なるコースをカバーするために最小学期を数えるプログラム


番号nがあるとすると、1からnまでのラベルが付けられたn個の異なるコースがあることを示します。また、relations [i]にペア(prevCourse_i、nextCourse_i)が含まれる、relationsという配列もあります。これは、コースprevCourse_iとコースnextCourse_iの間の前提条件の関係を表します。したがって、コースprevCourse_iはコースnextCourse_iの前に取得する必要があります。そして、私たちが持っている最後のパラメータはkです。 1学期では、前の学期に受講しているコースのすべての前提条件を満たしている限り、最大k個のコースを受講できます。すべてのコースを受講するために必要な最小学期数を見つける必要があります。

したがって、入力が次のような場合

Pythonのすべての異なるコースをカバーするために最小学期を数えるプログラム

最初の学期にコース1と2を受講できるため、出力は3になります。これで、コース3、4、5の資格が得られます。したがって、2学期に5と、3または4のいずれかを受講すると、次のようになります。次の学期にすべてのコースを終了することができます。したがって、合計3学期が必要です

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

  • 撮影:=新しいセット

  • g1:=n個の空のリストを含むリスト

  • g2:=サイズnの新しいリストで、0で埋めます

  • w:=サイズnの新しいリストで、0で埋めます

  • 学期:=0

  • 関係の各xについて、実行します

    • g1 [x [1] -1]

      の最後にx[0]-1を挿入します
    • g2 [x [0] -1]

      の最後にx[1]-1を挿入します
  • weight:=g1のすべてのアイテムの長さからの新しいリスト

  • 0からn-1の範囲のiの場合、実行

    • g1 [i]のxごとに、実行

      • w [x]:=最大w[x]と重み[i]

  • 取られたサイズ

    • コース:=新しいリスト

    • 0からn-1の範囲のiの場合、実行

      • g1 [i]が空で、iが取得されていない場合、

        • コースの最後に(i、w [i])を挿入します

      • コースのサイズがkより大きい場合、

        • コース=2番目のパラメータに基づいてコースを逆の順序で並べ替えます

        • コース:=最初のkコースのリスト

      • 学期:=学期+ 1

      • コースのxごとに、実行します

        • g2 [x [0]]のyごとに、実行

          • g1 [y]

            からx[0]を削除します
        • g2 [x [0]]:=空のリスト

        • x[0]をtakenに挿入

  • 学期を返す

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

def solve(n, relations, k):
   taken = set()
   g1 = [[] for _ in range(n)]
   g2 = [[] for _ in range(n)]
   w = [0] * n
   semester = 0
   for x in relations:
      g1[x[1]-1].append(x[0]-1)
      g2[x[0]-1].append(x[1]-1)

   weight = list(map(len, g1))
   for i in range(n):
      for x in g1[i]:
         w[x] = max(w[x], weight[i])


   while len(taken) < n:
      courses = []
      for i in range(n):
         if (not g1[i]) and (i not in taken):
            courses.append([i,w[i]])
      if len(courses) > k:
         courses = sorted(courses, key = lambda x:x[1],reverse=True)
         courses = courses[:k]

      semester += 1

      for x in courses:
         for y in g2[x[0]]:
            g1[y].remove(x[0])
         g2[x[0]] = []
         taken.add(x[0])
   return semester

n = 6
relations = [(1,3),(2,5),(2,4),(5,6)]
k = 2
print(solve(n, relations, k))

入力

6, [(1,3),(2,5),(2,4),(5,6)], 2

出力

3

  1. Pythonを使用してすべてのノードに到達するための頂点の最小数を見つけるプログラム

    n個の頂点とノードに0からn-1までの番号が付けられた有向非巡回グラフがあるとします。グラフはエッジリストで表されます。ここで、edges [i] =(u、v)はノードuからノードv。グラフ内のすべてのノードに到達できる頂点の最小セットを見つける必要があります。 (頂点は任意の順序で返すことができます)。 したがって、入力が次のような場合 これらの2つの頂点は他のどの頂点からも到達できないため、出力は[0,2,3]になります。したがって、それらから開始すると、すべてをカバーできます。 これを解決するには、次の手順に従います- n:=エッジのサイズ all_nodes:=

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

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