问题描述:给定一个序列,求目前出现次数最多的k个数字。
解题思路:动态处理,输入一个数,然后调整排序,用pair将数和频率联系起来,储存到数组中,然后排序。更方便。
AC代码:
#include<iostream>
#include<set>
#include<unordered_map>
using namespace std;
#define MAX 10000
unordered_map<int,int>tag;//将数值转化为频率。
set<int>arr[MAX];//出现次数为MAX的集合
int main()
{
freopen("test.txt","r",stdin);
int a,N,K,M=1,m=0,cnt;//m频率最高的次数
scanf("%d %d",&N,&K);
scanf("%d",&a);
tag[a]=0;
arr[tag[a]].insert(a);
while(--N){
scanf("%d",&a);
printf("%d:",a);
cnt=0;
while(M--){//从频率最高的次数集合中开始输出前K个。
set<int>::iterator it=arr[M].begin();
while(it!=arr[M].end()&&cnt<K){
printf(" %d",*it);
++cnt;++it;
}
if(cnt==K)break;
}
printf("\n");
if(tag.count(a)){//修改频率,以及插入新集合
arr[tag[a]].erase(a);
++tag[a];
if(tag[a]>m)m=tag[a];
arr[tag[a]].insert(a);
}else{//插入新元素
tag[a]=0;
arr[0].insert(a);
}
M=m+1;
}
return 0;
}