,
代码如下:
//方法一:使用map<int,int>,注意这里和map<int,vector<int>>不同,其中vector是容器(向量)
//关于插入补充:map使用insert(插入一对),priority_queue使用push,vector使用push_back插入值
//思想:map的key唯一-->记录有哪些数字,map的value不唯一并且与key关联-->装下数字用于计数
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;int a[N];
int main()
{
int n;cin>>n;
map<int,int> mymap;
int deletenumber=0;//记录要删除的数
//举例:11 222 333 4444 5,其中1和2都多了一个,删除一个1和2,其中3和4正好不用管,5少了,全删
for(int i=1;i<=n;++i)
{ cin>>a[i];//没有定义容器,找一个数组 遍历装入输入的每个数
mymap[a[i]]++;}//每遍历一个a[i],对应key为a[i]的value就加1,value记录每个key对应的数字个数
//由于这里的value不是容器,无法装入很多数字,这里value用于计数
//使用auto自动变量或者迭代器遍历mymap
//count别乱用:mymap.count(3)表示记录"为3的key"有几个,要么1(存在),要么0(不存在),key唯一
//不能用pair.second.count()记录value装入的值个数,这里没有定义容器
for(auto pair:mymap)
{
int num=pair.second;//value++记录了数字个数(初试默认value为空)
if(pair.first<num)//该数字小于该数字存在的数量 如:1,2
deletenumber+=num-pair.first;
else if(pair.first>num)//该数字大于该数字存在的数量 如:5
deletenumber+=num;
}
cout<<deletenumber<<endl;
return 0;
}