計算量に注意しつつ,条件を適切に言い換えて実装できるかを問う問題です.
問題原案:tnodino
重複する整数を持つ生徒を同一のクラスに振り分けることはできません.
この問題答えは各整数を持つ生徒の人数の最大値に一致することが証明できます.
連想配列など用いて各整数が に登場する回数を数えればよいです.
「ある つのクラスに,等しい整数を持った生徒が 人以上存在しない」という条件から「等しい整数を持った 人以上の生徒を同一のクラスに振り分けることはではできない」ということが分かります.
こちらに沿って考えてみましょう.
整数 を持った生徒が 人いるとします.
先述した条件により,各 について,クラスの個数は少なくとも 個必要であることが生じます.
つまり,必要なクラスの個数は は ,すなわち を満たします.
これを満たす の最小値は です.
要素の範囲が 程度であることを考えると,連想配列やそれに準ずるデータ構造を用いるのがよいでしょう.
C++ では std::map
や std::unordered_map
,Python では dict
や collections.defaultdict
などが使えます.
詳細は各言語のリファレンスや「実装例」の項を参照してください.
xxxxxxxxxx
using namespace std;
signed main() {
int n; cin >> n;
map<int,int> cnt;
for(int i=0; i<n; ++i) { int a; cin >> a; ++cnt[a]; }
cout << max_element(cnt.begin(), cnt.end(), [](auto a, auto b) { return a.second < b.second; })->second << "\n";
return 0;
}
xxxxxxxxxx
from collections import defaultdict
n = input()
A = [*map(int,input().split())]
cnt = defaultdict(int)
for a in A:
cnt[a] += 1
print(max(cnt.values()))