由完美序列的定义可以知道,序列中每个数字的个数,要么是等于它本身,要么就是一个没有。
如果一个数字出现的次数比它本身大,我们就选择删掉多出的,
这样肯定比完全删除是更优的,只有在当一个数字出现的次数小于它本身的时候,这种情况,我们不得不选择全部删除。
所以解决这个问题,只要统计每个数字出现的次数就可以了。由于数字的范围最大有 10^9 ,所以我们用一个 map 统计
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;//由于数字的范围最大有 10^9
signed main()
{
int n; cin >> n;
vector<int> a(n + 1);//定义vector数组, 容量为n+1
map<int, int> cnt;
//输入
for(int i = 1; i <= n; i ++) {
cin >> a[i];
cnt[a[i]] ++;
}
int ans = 0;
for(auto [x, y] : cnt)
{
//出现的次数>数字本身,删除掉多余的,直到等于数字本身为止.
if(y > x) ans += y - x;//算出要删除的次数,删除y-x次
else if(y < x) ans += y;//如果比数字小,则全删除,删除y次
}
cout << ans;
}