裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

トーナメントでの想定対戦数は?

2017年08月15日 | ブログラミング

トーナメントでの想定対戦数は?

締め切りが 2017/08/15 10:00 AM なので,その 1 分後に投稿されるように予約

設問

いよいよ夏の甲子園が始まります。
このような大会で用いられるのがトーナメント表です。
勝ち進んだことを想定し、どの投手をどの試合で使うのか検討することは珍しくありません。

今回はトーナメントにおける各チームの想定対戦数に注目します。
例えば、4チームでトーナメントを行うとき、トーナメント表の形として、以下のような形が考えられます。
このとき、各チームが決勝戦まで勝ち進んだときの対戦数は、それぞれ図の括弧内に書いた数字のようになります。



この想定対戦数の合計を考えると、左側の形は8、右側の形は9になります。
同様に、n チームでトーナメントを行うとき、この合計が最小になる形と最大になるような、トーナメント表の形を求めることにします。

標準入力から n が与えられたとき、考えられるトーナメント表の形について、想定対戦数の合計の「最小値」と「最大値」を標準出力にスペース区切りで出力してください。
なお、n は500以下の正の整数とします。
例えば、 n = 4 のとき、最小値は8、最大値は9ですので、以下のように出力します。

【入出力サンプル】
標準入力
4

標準出力
8 9

=================================================================

最大値となるのは,右の図のような最も不公平な一段階ずつ進行するトーナメント。
n が小さい方から数え上げると,n=2〜9 に対して,2, 5, 9, 14, 20, 27, 35, 44 のような階差数列で,一般項 an = (n-1)*(n+2)/2
最小値となるのは,チーム数が2の羃乗の場合は左のようなトーナメント。しかし,2の羃乗でない場合は,1回戦をパスするチームを作るトーナメント。
n=2〜9 に対して 2, 5, 8, 12, 16, 20, 24, 29 となり,オンライン整数列大辞典の "A003314: Binary entropy function"  https://oeis.org/A003314 である。

ということで,R で書くと以下のようになる。

f = function(n) {
    a = integer(n)
    a[1] = 0
    for (i in 2:n) {
        a[i] = i+a[floor(i/2)]+a[ceiling(i/2)]
    }
    cat(a[n], (n-1)*(n+2)/2)
}


#f(scan(file("stdin", "r")))
f(3) # 5 5
f(4) # 8 9
f(10) # 34 54
f(49) # 279 1224
f(500) # 4488 125249

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村