fork download
  1. # 都道府県 人口(人) 面積(km2)
  2. strData =<<_EOT_
  3. 北海道 5,248,552 83,424.39
  4. 青森県 1,246,138 9,645.64
  5. 岩手県 1,226,430 15,275.01
  6. 宮城県 2,303,160 7,282.29
  7. 秋田県 965,968 11,637.52
  8. 山形県 1,077,057 9,323.15
  9. 福島県 1,847,950 13,783.90
  10. 茨城県 2,868,041 6,097.39
  11. 栃木県 1,942,312 6,408.09
  12. 群馬県 1,937,626 6,362.28
  13. 埼玉県 7,337,330 3,797.75
  14. 千葉県 6,279,026 5,157.60
  15. 東京都 13,942,856 2,194.07
  16. 神奈川県 9,200,166 2,416.30
  17. 新潟県 2,222,004 12,584.24
  18. 富山県 1,042,998 4,247.59
  19. 石川県 1,137,181 4,186.05
  20. 福井県 767,742 4,190.52
  21. 山梨県 812,056 4,465.27
  22. 長野県 2,049,023 13,561.56
  23. 岐阜県 1,988,931 10,621.29
  24. 静岡県 3,639,226 7,777.35
  25. 愛知県 7,552,873 5,173.06
  26. 三重県 1,779,770 5,774.45
  27. 滋賀県 1,413,959 4,017.38
  28. 京都府 2,583,140 4,612.20
  29. 大阪府 8,823,453 1,905.29
  30. 兵庫県 5,463,609 8,400.94
  31. 奈良県 1,331,330 3,690.94
  32. 和歌山県 923,721 4,724.65
  33. 鳥取県 555,663 3,507.14
  34. 島根県 673,891 6,708.27
  35. 岡山県 1,891,346 7,114.33
  36. 広島県 2,807,987 8,479.64
  37. 山口県 1,355,495 6,112.53
  38. 徳島県 728,633 4,146.75
  39. 香川県 956,069 1,876.79
  40. 愛媛県 1,338,811 5,676.16
  41. 高知県 697,674 7,103.64
  42. 福岡県 5,110,113 4,986.51
  43. 佐賀県 814,211 2,440.70
  44. 長崎県 1,325,205 4,131.00
  45. 熊本県 1,746,740 7,409.45
  46. 大分県 1,134,431 6,340.76
  47. 宮崎県 1,072,077 7,735.33
  48. 鹿児島県 1,599,984 9,187.08
  49. 沖縄県 1,454,184 2,281.00
  50. _EOT_
  51.  
  52. arr = []
  53. strData.split("\n").each{|line|
  54. dat = line.split("\t")
  55. dat[1] = dat[1].tr( ',', '' ).to_i # 人口(人)
  56. dat[2] = dat[2].tr( ',', '' ).to_f # 面積(km2)
  57. arr << dat
  58. }
  59.  
  60. def bcut( arr, mx )
  61. w = arr.dup
  62. w.sort_by{|x| x[2] }.each_with_index{|x,i| x[3] = i > mx }
  63. w.sort_by{|x| -x[1]/x[2] }.each_with_index{|x,i| x[3] = x[3] && i > mx }
  64. w.delete_if{|x| x[3]}
  65. end
  66.  
  67. def solver( arr )
  68. ans_max = 0
  69. ans = []
  70. arr.combination( 20 ){|x|
  71. ps = x.inject(0){|r, i| r + i[1] } / x.inject(0){|r, i| r + i[2] }
  72. next if ans_max > ps
  73. ans_max = ps
  74. ans = x
  75. }
  76. [ ans, ans_max ]
  77. end
  78.  
  79. ansmap = []
  80. 12.upto(19){|mx|
  81. wrk = bcut( arr, mx )
  82. ans, ans_max = solver( wrk )
  83. puts "# #{mx} : #{wrk.size} #{'%12.6f' % ans_max} 人/km2"
  84. puts "[#{ans.map{|a| a[0]}.join(",")}]" if ansmap != ans # 前回と同じ解は出力を省略
  85. ansmap = ans
  86. }
  87.  
  88.  
  89. =begin
  90.  
  91. 959 デフォルトの名無しさん 2020/02/24(月) 20:48:14.13 ID:D8qhYUus
  92.   [お題]
  93.   URLのページに都道府県別の人口と面積が載っている。
  94.    今回使用するのは、2019.10.1のデータ
  95.    URL: https://u...content-available-to-author-only...b.jp/pjn/pb.html
  96.  
  97.    異なる20都道府県を選んで人口密度(人/km2)を最大化する。
  98.    人口密度は、少数6桁程度表示
  99.    選んだ都道府県名を 20個表示する(表示されてる順 ← 県コード順)。
  100.  
  101.    例えば、3都道府県なら、
  102.     4906.099305 人/km2
  103.     [東京都, 神奈川県, 大阪府]
  104.  
  105.   ※入力はwebページから(工夫して)コピペで、スクレイピングの問題じゃない。
  106.  
  107. -------
  108.  
  109. 人口密度と面積の順位で枝刈り
  110. 14位..22位まで結果が同じだったので多分
  111.  
  112. 1008.245481 人/km2
  113. [茨城県,埼玉県,千葉県,東京都,神奈川県,富山県,石川県,愛知県,滋賀県,京都府,大阪府,兵庫県,奈良県,鳥取県,徳島県,香川県,福岡県,佐賀県,長崎県,沖縄県]
  114.  
  115. =end
  116.  
Success #stdin #stdout 4.06s 6528KB
stdin
Standard input is empty
stdout
# 12 : 20   996.618903 人/km2
[茨城県,埼玉県,千葉県,東京都,神奈川県,石川県,静岡県,愛知県,滋賀県,京都府,大阪府,兵庫県,奈良県,鳥取県,徳島県,香川県,福岡県,佐賀県,長崎県,沖縄県]
# 13 : 21  1005.496874 人/km2
[茨城県,埼玉県,千葉県,東京都,神奈川県,石川県,福井県,愛知県,滋賀県,京都府,大阪府,兵庫県,奈良県,鳥取県,徳島県,香川県,福岡県,佐賀県,長崎県,沖縄県]
# 14 : 22  1008.245481 人/km2
[茨城県,埼玉県,千葉県,東京都,神奈川県,富山県,石川県,愛知県,滋賀県,京都府,大阪府,兵庫県,奈良県,鳥取県,徳島県,香川県,福岡県,佐賀県,長崎県,沖縄県]
# 15 : 23  1008.245481 人/km2
# 16 : 24  1008.245481 人/km2
# 17 : 25  1008.245481 人/km2
# 18 : 26  1008.245481 人/km2
# 19 : 27  1008.245481 人/km2