题目名称:数列问题
题目链接:数列问题
描述
给定一个长度为N数列A = [ A 1 , A 2 , . . . A N A_1, A_2, ... A_N A1,A2,...AN],由于某种原因,小Ho对这个数列有些不满意。
他希望每个在数列中出现的数值,其出现的次数都是唯一的。
假设A = [1, 1, 2, 2],1和2都出现了2次,小Ho就会不满意。
于是小Ho决定从A中删除一些数,使得每个数值出现次数都是唯一的。
小Ho想知道他最少要删除几个数?
例如对于A = [1, 1, 2, 2],最少删除一个数变成[1, 2, 2]或[1, 1, 2]。
输入
第一行包含一个整数N。
第二行包含N个整数 $A_1, A_2, … A_N $ 。
1 <= N <= 100000 1 <= A i A_i Ai <= 1000000
输出
一个整数代表答案
样例输入
4
1 2 2 1
样例输出
1
解题思路
使用哈希表处理问题,当有多个数的出现次数的数值相同时,删除其中一个数字并判断该处的哈希值是否为空,如为空,则保存并记录与修改哈希值,否则继续删除直到全部删除为止
完整代码
#include<bits/stdc++.h>
using namespace std;
#define N 1000010
map<int,int>m;
int t,a;
int table[N];
int main()
{
int st;
memset(table,0,sizeof(table));
cin>>t;
while(t--){
cin>>a;
m[a]++;
}
for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
table[it->second]++;
}
int ans=0;
for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
if(table[it->second]>1){
while(table[it->second]>1){
table[it->second]--;
st=it->second;
while(table[st]!=0&&st!=0){
ans++;
st--;
}
table[st]=1;
}
}
}
cout<<ans<<endl;
return 0;
}