http://abc064.contest.atcoder.jp/tasks/abc064_c
解法
http://abc064.contest.atcoder.jp/submissions/1340933 (kotlin)
実装のやり方だが、こういう区間を持っておく時は片方だけ持っておけばいい。
line = intArrayOf(1, 400, 800, 1200, 1600, 2000, 2400, 2800, 5050)
(5050は適当なmaxの値)
この中のどれに入るかを判定すればよい。
もし、line[i] <= a <= line[i + 1]に入るなら、i番目の色となる。
これで、灰色~赤色を数えて、3200以上を別に持っておく。
色の最小は3200以上を既に存在している色に集めればいいので、灰色~赤色の種類数が答え。
もし、その種類数が0、つまり、全て3200以上の時はどうしても色が1つ増えるので、それだけ注意。
色の最大は3200以上を全て新しい色にすればいいので、灰色~赤色の種類数 + 3200以上の人数が答え。
var line = intArrayOf(1, 400, 800, 1200, 1600, 2000, 2400, 2800, 5050) fun solve() { var N = ni() var A = na(N) A.sort() var color:MutableSet<Int> = mutableSetOf() var non = 0 for(a in A) { if(3200 <= a) { non++ continue } for(j in 0..7) { if(a in line[j] until line[j + 1]) color.add(j) } } var max = color.size + non var min = Math.max(color.size, 1) out.println("$min $max") }