ABC-064 C Colorful Leaderboard を解いてみた

昨日記事をあげたかったのですが、疲れ切っててあげることができませんでした。。 今回の問題は学ぶことがAC取った後にあったので、今後気をつけていこうかなと思います。。

では、以下問題

Colorful Leaderboard

実行時間制限: 2 sec / メモリ制限: 256 MB

配点 : 300 点

問題文 AtCoderでは、コンテストに参加すると「色」が付き、これはレートによって次のように変化します:

レート 1-399:灰色 レート 400-799:茶色 レート 800-1199:緑色 レート 1200-1599:水色 レート 1600-1999:青色 レート 2000-2399:黄色 レート 2400-2799:橙色 レート 2800-3199:赤色 また、レートが 3200 以上になると色を自由に変えることができます。 現在 N 人の人がAtCoderのコンテストに参加したことがあり、i 人目の人のレートは ai です。 そのとき、色の種類数の最小値と最大値を求めなさい。

制約 1≤N≤100 1≤ai≤4800 ai は整数である。


とこんな感じ

考えたこと

色の数が必要なのでその色にいる人をカウントするデータ構造を作って3200以上の人は個別にカウントする

フロー

  • 入力の受け取り
  • 色が存在するデータ構造の初期化
  • 入力の回数以下の処理を繰り返す
    • 入力を受け取り
    • レートの場所にたいしてデータを格納する
  • 色の数分処理を繰り返し
    • 3200 以上の人以外は1をmin,maxに足す
  • max には 3200人以上の人の数分足す
  • minには0の場合1を代入する
  • 出力というフロー

コード

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

int main(void){
    int N,min,max;
    cin >> N;
    vector<int> color(9);
    for(int i = 0;i < 9;i++){
        color[i] = 0;
    }
    min = 0;
    max = 0;
    for(int i = 0;i < N;i++){
        int tmp;
        cin >> tmp;
        if(tmp >= 1 && tmp < 400){
            color[0]++;
        }else if(tmp >= 400 && tmp < 800){
            color[1]++;
        }else if(tmp >= 800 && tmp < 1200){
            color[2]++;
        }else if(tmp >= 1200 && tmp < 1600){
            color[3]++;
        }else if(tmp >= 1600 && tmp < 2000){
            color[4]++;
        }else if(tmp >= 2000 && tmp < 2400){
            color[5]++;
        }else if(tmp >= 2400 && tmp < 2800){
            color[6]++;
        }else if(tmp >= 2800 && tmp < 3200){
            color[7]++;
        }else if(tmp >= 3200 && tmp <= 4800){
            color[8]++;
        }
    }
    for(int i = 0;i < 9;i++){
        max = color[i] != 0 && i != 8 ? max + 1 : max;
        min = color[i] != 0 && i != 8 ? min + 1 : min;
    }
    max = color[8] + max;
    min = min != 0 ? min : 1;
    cout << min << " " << max << endl;
    return 0;
}

ですが、ここで気づきます。真ん中の邪魔臭いって ここの真ん中のifは実際には400の倍数飛ばしになっているので2重ループを回しながら(N * color)をしながらデータ構造を作ればもっとスマートになります。 問題解釈と把握能力ですかね。。