トップページに戻る    次のPHPのサンプルへ    前のPHPのサンプルへ

Q10 アダムズ方式で議席数を計算せよ!


PHPのソース

<?php

$PrefArr = array( 5381733, 1308265,  1279594,  2333899, 1023119,
                  1123891, 1914039,  2916976,  1974255, 1973115,
                  7266534, 6222666, 13515271,  9126214, 2304264,
                  1066328, 1154008,   786740,   834930, 2098804,
                  2031903, 3700305,  7483128,  1815865, 1412916,
                  2610353, 8839469,  5534800,  1364316,  963579,
                   573441,  694352,  1921525,  2843990, 1404729,
                   755733,  976263,  1385262,   728276, 5101556,
                   832832, 1377187,  1786170,  1166338, 1104069,
                  1648177, 1433566);

$NeedGiseki = 289;

$L = 1;
$R = max($PrefArr);

while ($L < $R){
    $Mid = floor(($L + $R) / 2);

    $SumGiseki = 0;
    foreach($PrefArr as $EachVal){
        $SumGiseki += ceil($EachVal / $Mid);
    }
    if($SumGiseki == $NeedGiseki){
        for($I = 0 ; $I <= count($PrefArr) - 1 ; $I++){
            printf("都道府県%02dの議席数は、%02d", $I + 1 , ceil($PrefArr[$I] / $Mid) );
            echo PHP_EOL;
        }
        break;
    }
    elseif($SumGiseki < $NeedGiseki){
        $R = $Mid - 1;
    } else {
        $L = $Mid + 1;
    }
}


実行結果

都道府県01の議席数は、12
都道府県02の議席数は、03
都道府県03の議席数は、03
都道府県04の議席数は、05
都道府県05の議席数は、03
都道府県06の議席数は、03
都道府県07の議席数は、04
都道府県08の議席数は、07
都道府県09の議席数は、05
都道府県10の議席数は、05
都道府県11の議席数は、16
都道府県12の議席数は、14
都道府県13の議席数は、29
都道府県14の議席数は、20
都道府県15の議席数は、05
都道府県16の議席数は、03
都道府県17の議席数は、03
都道府県18の議席数は、02
都道府県19の議席数は、02
都道府県20の議席数は、05
都道府県21の議席数は、05
都道府県22の議席数は、08
都道府県23の議席数は、16
都道府県24の議席数は、04
都道府県25の議席数は、03
都道府県26の議席数は、06
都道府県27の議席数は、19
都道府県28の議席数は、12
都道府県29の議席数は、03
都道府県30の議席数は、03
都道府県31の議席数は、02
都道府県32の議席数は、02
都道府県33の議席数は、05
都道府県34の議席数は、06
都道府県35の議席数は、03
都道府県36の議席数は、02
都道府県37の議席数は、03
都道府県38の議席数は、03
都道府県39の議席数は、02
都道府県40の議席数は、11
都道府県41の議席数は、02
都道府県42の議席数は、03
都道府県43の議席数は、04
都道府県44の議席数は、03
都道府県45の議席数は、03
都道府県46の議席数は、04
都道府県47の議席数は、03


解説

二分法で解いてます。