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';
}
posted @ 2025-05-06 09:29  _Yxc  阅读(9)  评论(0)    收藏  举报