fork download
  1.  
  2.  
  3. adt = [
  4. ['北海道', 5248552, 83424.39], ['青森県', 1246138, 9645.64],
  5. ['岩手県', 1226430, 15275.01], ['宮城県', 2303160, 7282.29],
  6. ['秋田県', 965968, 11637.52], ['山形県', 1077057, 9323.15],
  7. ['福島県', 1847950, 13783.9], ['茨城県', 2868041, 6097.39],
  8. ['栃木県', 1942312, 6408.09], ['群馬県', 1937626, 6362.28],
  9. ['埼玉県', 7337330, 3797.75], ['千葉県', 6279026, 5157.6],
  10. ['東京都', 13942856, 2194.07], ['神奈川県', 9200166, 2416.3],
  11. ['新潟県', 2222004, 12584.24], ['富山県', 1042998, 4247.59],
  12. ['石川県', 1137181, 4186.05], ['福井県', 767742, 4190.52],
  13. ['山梨県', 812056, 4465.27], ['長野県', 2049023, 13561.56],
  14. ['岐阜県', 1988931, 10621.29], ['静岡県', 3639226, 7777.35],
  15. ['愛知県', 7552873, 5173.06], ['三重県', 1779770, 5774.45],
  16. ['滋賀県', 1413959, 4017.38], ['京都府', 2583140, 4612.2],
  17. ['大阪府', 8823453, 1905.29], ['兵庫県', 5463609, 8400.94],
  18. ['奈良県', 1331330, 3690.94], ['和歌山県', 923721, 4724.65],
  19. ['鳥取県', 555663, 3507.14], ['島根県', 673891, 6708.27],
  20. ['岡山県', 1891346, 7114.33], ['広島県', 2807987, 8479.64],
  21. ['山口県', 1355495, 6112.53], ['徳島県', 728633, 4146.75],
  22. ['香川県', 956069, 1876.79], ['愛媛県', 1338811, 5676.16],
  23. ['高知県', 697674, 7103.64], ['福岡県', 5110113, 4986.51],
  24. ['佐賀県', 814211, 2440.7], ['長崎県', 1325205, 4131.0],
  25. ['熊本県', 1746740, 7409.45], ['大分県', 1134431, 6340.76],
  26. ['宮崎県', 1072077, 7735.33], ['鹿児島県', 1599984, 9187.08],
  27. ['沖縄県', 1454184, 2281.0]
  28. ]
  29.  
  30. def ck(mid, cnt):
  31. wdt = []
  32. for z1,z2,z3 in adt:
  33. wdt.append(z2 - z3 * mid)
  34. wdt.sort(reverse = True)
  35. return sum(wdt[:cnt]) >= 0
  36.  
  37. def disp(mid, cnt):
  38. wdt = []
  39. for ix, z in enumerate(adt):
  40. wdt.append([z[1] - z[2] * mid, ix, z[1],z[2]])
  41. wdt.sort(reverse = True)
  42. smp, sma, ksi = 0, 0, 0
  43. for q in wdt[:cnt]:
  44. ksi |= 1<<q[1]
  45. smp += q[2]
  46. sma += q[3]
  47. print(f"{smp / sma:.6f}人/km2)\n [", end=" ")
  48. for i in range(47):
  49. if ksi>>i & 1: print(adt[i][0], end=" ")
  50. print("]")
  51.  
  52. def fnc(cnt):
  53. ok , ng = 0.0, 10000.0
  54. for q in range(100):
  55. mid = (ok + ng ) /2.0
  56. if ck(mid, cnt) : ok = mid
  57. else: ng = mid
  58. #print(ok)
  59. disp(ok, cnt)
  60.  
  61.  
  62. fnc(20)
  63.  
Success #stdin #stdout 0.02s 9120KB
stdin
Standard input is empty
stdout
1008.245481人/km2)
 [ 茨城県 埼玉県 千葉県 東京都 神奈川県 富山県 石川県 愛知県 滋賀県 京都府 大阪府 兵庫県 奈良県 鳥取県 徳島県 香川県 福岡県 佐賀県 長崎県 沖縄県 ]