学生n人をk組のクラスに分ける。各クラスの人数は偏ってもいいが、最低1人以上とする。クラス分けのスコアを次のように定義する。
スコア=max 1<=i<=k (クラスiにおける最高点-クラスiにおける最低点)
スコアが最小となるクラス分けが望ましい。
クラスkと学生の点数を読み取り、クラス分けの最少スコアを出力せよ。
入力例:
k=3
点数=[10,25,6,0,88,99,36,50]
出力例:
25
この例の場合は、0点,6点,10点,25点の学生を1組、36点,50点を2組、88点,99点を3組とすれば、最少スコア25を得られる。
考え方:スコアがs以下であるクラス分けが存在するクラス数の最小値をf(s)とすると、この問題は、f(s)<=kであるような最小のsを求める問題である。sを二分木探索で求めよ。二分探索を実装するためには、sを引数として受け取り、f(s)の値を返す関数を作成する必要がある。f(s)は次の手順で計算できる。
f(s)の計算アルゴリズム:
1.試験の点数を昇順となるようソートする。
2.t:=1,i:=0とする
3.jをi<=j<=n-1, a[j]<=a[i]+s を満たす最大の整数とする。(点数がa[i],...,a[j]の学生たちを一つのクラスとする)
4.j<n-1ならば、t:=t+1, i:=j+1とし3に戻る。それ以外ならば、tをf(s)の値として出力し終了する。
※sの取りうる値は0以上max 0<=i<=n-1 a[i] 以下の整数である。
上記の問題をpythonで作りたいのですが、成績をソートした後にどのようにすればいいのかわかりません。全体のプログラムを教えていただけると幸いです。
あなたの回答
tips
プレビュー