题目链接: www.lanqiao.cn/problems/31…
我刚开始是这样写的:
#include <iostream>
#include<map>
using namespace std;
const int N = 1e5;
int a[N];
int main()
{
int n = 0; cin >> n;
map<int, int> m;
for (int i = 0; i < n; i++)
{
int temp=0;
cin >> temp;
m[temp]++;
}
int cnt=0;
for (auto ch : m)
{
int x=ch.first;
int y=ch.second;
//cout << ch.first << " "<<ch.second << endl;
if(x!=y)cnt++;
}
cout << cnt<<endl;
return 0;
}
结果就通过一个样例:
原因是因为我只考虑了这种情况:
1 2 2 3 3 3 13 5
像上面的情况就是实例大于出现次数的情况, 应该删掉13,5.因为他们次数不够,最后变为:
1 2 2 3 3 3
但是还有一种情况,如下:
1 2 2 3 3 3 3
像这种情况,就是出现次数大于实例本身 的情况。
对于这种情况,我们用出现次数-实例本身解决,4-3=1,所以删掉1个3即可,变为如下:
1 2 3 3 3
code
#include <iostream>
#include<map>
using namespace std;
const int N = 1e5;
int a[N];
int main()
{
int n = 0; cin >> n;
map<int, int> m;
for (int i = 0; i < n; i++)
{
int temp=0;
cin >> temp;
m[temp]++;
}
int cnt=0;
for (auto ch : m)
{
int x=ch.first;
int y=ch.second;
//cout << ch.first << " "<<ch.second << endl;
if (x<y)
{
cnt+=y-x;
}
else if(x>y)
{
cnt+=y;
}
}
cout << cnt<<endl;
return 0;
}