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

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

AtCoder ABC 295 C - Socks (5Q, 灰色, 300 点)

連想配列で集計するといい感じに解ける!

問題概要

 N 枚の靴下があって、靴下  i の色は  A_{i} という整数値で表される。

色の等しい靴下をペアにするとき、最大で何ペア作れるか?

制約

  •  1 \le N \le 5 \times 10^{5}
  •  1 \le A_{i} \le 10^{9}

考えたこと

次のように考えたい。


  • 色ごとに靴下が何個あるかを整理する
  • そして、色ごとに、靴下が何ペア作れるかを求める(その色の靴下が  n 枚のとき n/2 ペア作れる)
  • その総和を求めれば良い

この作業をするにあたって、連想配列が使える。C++ であれば、map<int, int> 型がピッタリである。

一般に、C++ の map の要素にアクセスするのに要する計算量は  O(\log N) であるから、上記の解法の計算量は  O(N \log N) となる。

コード

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

int main() {
    int N, A;
    cin >> N;
    map<int, int> ma;
    for (int i = 0; i < N; i++) {
        cin >> A;
        ma[A]++;
    }

    int res = 0;
    for (auto [color, num] : ma) res += num / 2;
    cout << res << endl;
}