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

Pythonで最大平均合格率を見つけるプログラム


classes [i]が[pass_i、total_i]を表すクラスのリストがあるとします。それぞれ、i番目のクラスの試験に合格した学生の数とi番目のクラスの学生の総数を表します。また、別の価値もあります。これは、割り当てられたクラスの試験に合格することが保証されている優秀な学生の数が多いことを示しています。すべてのクラスで合格した生徒の平均数を最大化する方法で、追加の各生徒をクラスに割り当てる必要があります。合格するクラスの生徒数をクラスの生徒の総数で割って決定されるクラスの合格率。また、平均合格率は、すべてのクラスの合格率の合計をクラス数で割ったものです。追加の学生を割り当てた後、可能な限り最大の平均合格率を見つける必要があります。

したがって、入力がclasses =[[2,3]、[4,6]、[3,3]]、extra =3のような場合、最初のクラスに2人の生徒が追加され、1人が追加されるため、出力は0.83809になります。比率を最大化するために2番目のクラスに追加の生徒がいるため、平均は(4/5 + 5/7 + 3/3)/ 3=0.83809になります。

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

  • h:=クラス内の各ペア(a、b)の(a / b-(a + 1)/(b + 1)、a、b)のようなタプルのリスト

  • hをヒープ化する

  • extraがゼロ以外の場合は、実行してください

    • (v、a、b):=hの先頭、hから削除

    • (a、b):=(a + 1、b + 1)

    • (-(a + 1)/(b + 1)+ a / b、a、b)をヒープに挿入します

    • extra:=extra-1

  • hのすべてのタプルからの平均を返す

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

import heapq
def solve(classes, extra):
   h = [(a / b - (a + 1) / (b + 1), a, b) for a, b in classes]
   heapq.heapify(h)
   while extra:
      v, a, b = heapq.heappop(h)
      a, b = a + 1, b + 1
      heapq.heappush(h, (-(a + 1) / (b + 1) + a / b, a, b))
      extra -= 1
   return sum(a / b for v, a, b in h) / len(h)

classes = [[2,3],[4,6],[3,3]]
extra = 3
print(solve(classes, extra))

入力

[[2,3],[4,6],[3,3]], 3

出力

0

  1. Pythonの任意の場所に5を追加して最大数を見つけるプログラム

    数nがあるとすると、その数のどこかに5を挿入して、取得できる最大数を見つける必要があります。 したがって、入力がn =834の場合、出力は8534になります。 これを解決するには、次の手順に従います- 0の場合、 s:=n as string k:=空白の文字列 c:=False sの各文字iについて、実行します i <5でcがFalseの場合、 k:=k連結5連結i c:=True それ以外の場合 k:=k連結i kを整数として返す それ以外の場合 k:=空白の文字列 s:=| n

  2. Pythonで最大の建物の高さを見つけるプログラム

    値nと、制限と呼ばれるペアの別のリストがあるとします。都市にn棟の新しい建物を建てたいと思っています。ただし、制限はほとんどありません。私たちは一列に建てることができ、建物には1からnまでのラベルが付けられています。制限には2つのパラメーターがあるため、restrictions [i] =(id_i、max_height_i)は、id_iの高さがmax_height_i以下でなければならないことを示します。新しい建物の高さに関する市の制限は次のとおりです- 各建物の高さは0または正の値である必要があります。 最初の建物の高さは0でなければなりません。 隣接する2つの建物の高さ