はまやんはまやんはまやん

hamayanhamayan's blog

Colorful Leaderboard [AtCoder Beginner Contest 064 C]

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")
}