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)をしながらデータ構造を作ればもっとスマートになります。 問題解釈と把握能力ですかね。。