けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 240 B - Count Distinct Integers (6Q, 灰色, 200 点)

いろんな方法が考えられる超典型問題

問題概要

長さ  N の整数数列  a_{1}, a_{2}, \dots, a_{N} が与えられる。

この数列に含まれる整数の種類数を答えよ。

制約

  •  1 \le N \le 1000
  •  1 \le a_{i} \le 10^{9}

解法

set 型の知識があれば、それを用いるのが最も楽だと思う (他の方法は公式解説を参照)。C++ の set 型を用いると、

  •  x を集合  S に挿入する処理:S.insert(x)
  • 集合  S に含まれる整数の個数を求める処理:S.size()

と書ける。すでに  x S に含まれているときは、 S は変化しない。

よって、次のように問題が解ける。


  1.  a_{1}, \dots, a_{N} を順に集合  S を挿入する
  2. 集合  S に含まれる整数の個数を答える

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;
    set<int> S;
    for (int i = 0; i < N; ++i) {
        int a; cin >> a;
        S.insert(a);
    }
    cout << S.size() << endl;
}