D. Candy Box (easy version)

https://codeforces.com/problemset/problem/1183/D

题意:给定n个数的数组,每个数<=n,现要将这些数出现的次数组合到一起,并且组合后每个数出现的次数不能相同,问组合后最多有多少数?

思路:统计后降序排序,维护一个变量pre,然后累加即可。

inline void solve() {
int n;
cin >> n;

vector a(n + 1);
for (int i = 0; i < n; ++i) {
int t;
cin >> t;
a[t] ++;
}

vector 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';
}

posted @ 2025-05-06 09:29  _Yxc  阅读(40)  评论(0)    收藏  举报