题目:链接
题意
完美序列是指序列中的每一个数字出现的次数是其本身的大小,空序列也是完美序列。一次操作是指删除序列中的一个数。现给定一个序列,请问最少需要多少次操作才能得到完美序列。
思路
题目中有两个重要的信息,一个是数字的大小,另一个是数字出现的次数,所以可以采用map容器存储这样一组键值对,map<int, int> cnt; 前一个int是数字的大小,后一个int是数字出现的次数。
心得
1、动态数组的创建,vector a(n+1), 括号中的数字表示容器大小,一定要有,因为空的vector直接访问下标如a[0]会崩溃。2、对于map容器的遍历,for(auto [x, y]:cnt);
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;cin>>n;
vector<int> a(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;
else if(y < x) ans += y;
}
cout<<ans<<'\n';
return 0;
}