AtCoderをやって9 (Colorful Leaderboard)
問題
AtCoderでは、コンテストに参加すると「色」が付き、これはレートによって次のように変化します:
- レート 1-399:灰色
- レート 400-799:茶色
- レート 800-1199:緑色
- レート 1200-1599:水色
- レート 1600-1999:青色
- レート 2000-2399:黄色
- レート 2400-2799:橙色
- レート 2800-3199:赤色
また、レートが 3200 以上になると色を自由に変えることができます。 現在 N 人の人がAtCoderのコンテストに参加したことがあり、i 人目の人のレートは a iです。 そのとき、色の種類数の最小値と最大値を求めなさい。
自分の回答(他の方の解答参照)
解き方をどうするかでそもそも躓いてしまいました。 ポイントは
- レート3200以上は別でカウントする(色が他のレートと同一の場合と、違う色の場合それぞれが存在する為)
- その他のレートは400毎に変わっているのでレートを除算の商で区別できる
最初何でレートを400で割った商で区別できるんだ?と思ったけど、rubyの除算の商は整数を返す(小数点切り捨て)からですね。
n = gets.chomp.to_i # レート3200以上の場合をカウント top_cnt = 0 # それ以外のレートの場合は400の除算の商を格納 rate_number = [] gets.chomp.split.map(&:to_i).each do |i| if 3200 <= i top_cnt += 1 else rate_number << (i / 400) end end if rate_number.empty? # 3200以上のレートだけだった場合 puts "1 #{top_cnt}" else number_of_types = rate_number.uniq.count puts "#{number_of_types} #{number_of_types + top_cnt}" end