D. Candy Box (easy version)
https://codeforces.com/problemset/problem/1183/D
题意:给定n个数的数组,每个数<=n,现要将这些数出现的次数组合到一起,并且组合后每个数出现的次数不能相同,问组合后最多有多少数?
思路:统计后降序排序,维护一个变量pre,然后累加即可。
inline void solve() {
int n;
cin >> n;
vector<int> a(n + 1);
for (int i = 0; i < n; ++i) {
int t;
cin >> t;
a[t] ++;
}
vector<int> pos(n + 1);
iota(pos.begin(), pos.end(), 0);
sort(pos.begin(), pos.end(), [&](const int i, const int j) {
return a[i] > a[j];
});
int pre = n + 1;
int ans = 0;
for (auto p : pos) {
if (!a[p]) {
break;
}
else if (a[p] < pre) {
ans += a[p];
pre = a[p];
}
else if (a[p] == pre){
ans += a[p] - 1;
pre = a[p] - 1;
}
else {
ans += max(0, pre - 1);
pre = max(0, pre - 1);
}
}
cout << ans << '\n';
}

浙公网安备 33010602011771号