おじさんの競プロ記録

自分の力で解答できた問題を振り返り、理解を深めたいです。

AtCoder Beginner Contest 064 C - Colorful Leaderboard

問題

問題文へ

N人のAtCoderのレートが与えられます。レートごとに色を与えます。最小で何色、最大で何色必要かを求めます。

制約

  • {1 \leqq N \leqq 100}
  • {1 \leqq a_i \leqq 4800}
  • {a_iは整数である。}

考えたこと

レート3200以上は自由に色を選べるため、処理を分けます。

レート1~3199は400で割れば0~7になるため、8個の配列に記録すれば何色が使われたかわかります。

3200以上だけで与えられたときの場合分けができず、WAになってしまいました。

コード

#define _GIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(v) v.begin(), v.end()
using namespace std;
using ll = long long;


int main(void) {
  int N;
  cin >> N;
  
  vector<int> colors(8, 0);
  int over = 0;
  rep(i, N) {
    int num;
    cin >> num;

    if (num >= 3200) {
      ++over;
    } else {
      colors[num / 400]++;
    }
  }

  int sum = 0;
  rep(i, colors.size()) {
    if (colors[i]) ++sum;
  }

  int ans_min = max(1, sum);
  int ans_max = sum + over;

  cout << ans_min << " " << ans_max << endl;

  
  return 0;
}

解説を読んで

場合分けをきちんとしなければいけませんでした。