题目:链接

题意

完美序列是指序列中的每一个数字出现的次数是其本身的大小,空序列也是完美序列。一次操作是指删除序列中的一个数。现给定一个序列,请问最少需要多少次操作才能得到完美序列。

思路

题目中有两个重要的信息,一个是数字的大小,另一个是数字出现的次数,所以可以采用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;
}