fork download

adt = [
    ['北海道', 5248552, 83424.39], ['青森県', 1246138, 9645.64],
    ['岩手県', 1226430, 15275.01], ['宮城県', 2303160, 7282.29],
    ['秋田県', 965968, 11637.52], ['山形県', 1077057, 9323.15],
    ['福島県', 1847950, 13783.9], ['茨城県', 2868041, 6097.39],
    ['栃木県', 1942312, 6408.09], ['群馬県', 1937626, 6362.28],
    ['埼玉県', 7337330, 3797.75], ['千葉県', 6279026, 5157.6],
    ['東京都', 13942856, 2194.07], ['神奈川県', 9200166, 2416.3],
    ['新潟県', 2222004, 12584.24], ['富山県', 1042998, 4247.59],
    ['石川県', 1137181, 4186.05], ['福井県', 767742, 4190.52],
    ['山梨県', 812056, 4465.27], ['長野県', 2049023, 13561.56],
    ['岐阜県', 1988931, 10621.29], ['静岡県', 3639226, 7777.35],
    ['愛知県', 7552873, 5173.06], ['三重県', 1779770, 5774.45],
    ['滋賀県', 1413959, 4017.38], ['京都府', 2583140, 4612.2],
    ['大阪府', 8823453, 1905.29], ['兵庫県', 5463609, 8400.94],
    ['奈良県', 1331330, 3690.94], ['和歌山県', 923721, 4724.65],
    ['鳥取県', 555663, 3507.14], ['島根県', 673891, 6708.27],
    ['岡山県', 1891346, 7114.33], ['広島県', 2807987, 8479.64],
    ['山口県', 1355495, 6112.53], ['徳島県', 728633, 4146.75],
    ['香川県', 956069, 1876.79], ['愛媛県', 1338811, 5676.16],
    ['高知県', 697674, 7103.64], ['福岡県', 5110113, 4986.51],
    ['佐賀県', 814211, 2440.7], ['長崎県', 1325205, 4131.0],
    ['熊本県', 1746740, 7409.45], ['大分県', 1134431, 6340.76],
    ['宮崎県', 1072077, 7735.33], ['鹿児島県', 1599984, 9187.08],
    ['沖縄県', 1454184, 2281.0]
]

def ck(mid, cnt):
    wdt = []
    for z1,z2,z3 in adt:
        wdt.append(z2 - z3 * mid)
    wdt.sort(reverse = True)
    return sum(wdt[:cnt]) >= 0

def disp(mid, cnt):
    wdt = []
    for ix, z in enumerate(adt):
        wdt.append([z[1] - z[2] * mid, ix, z[1],z[2]])
    wdt.sort(reverse = True)
    smp, sma, ksi = 0, 0, 0
    for q in wdt[:cnt]:
        ksi |= 1<<q[1]
        smp += q[2]
        sma += q[3]
    print(f"{smp / sma:.6f}人/km2)\n [", end=" ")
    for i in range(47):
        if ksi>>i & 1: print(adt[i][0], end=" ")
    print("]")

def fnc(cnt):
    ok , ng = 0.0, 10000.0
    for q in range(100):
        mid = (ok + ng ) /2.0
        if ck(mid, cnt) : ok = mid
        else: ng = mid
    #print(ok)
    disp(ok, cnt)


fnc(20)
Success #stdin #stdout 0.02s 9120KB
stdin
Standard input is empty
stdout
1008.245481人/km2)
 [ 茨城県 埼玉県 千葉県 東京都 神奈川県 富山県 石川県 愛知県 滋賀県 京都府 大阪府 兵庫県 奈良県 鳥取県 徳島県 香川県 福岡県 佐賀県 長崎県 沖縄県 ]