Hihocoder-数列问题

题目名称:数列问题

题目链接:数列问题

描述

给定一个长度为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
using namespace std;
#define N 1000010
mapm;
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::iterator it=m.begin();it!=m.end();it++){
		table[it->second]++;
	}
	int ans=0;
	for(map::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<

你可能感兴趣的:(哈希表)