本题刚开始采用的结构体的方式处理这个问题,但是最后导致了3、4两例出现了超时错误,在看了一些同学的分享之后,得出了如下的解法,解法有点类似于缩减样本空间,本来每次都需要排序的,缩减之后变成了每次只有排前面的四个就好,第四个即为当前的输入数据。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=50010;
bool hashtable[maxn]={false};
int value[maxn],cnt[maxn]={0},num=0;
bool cmp(int a,int b)
{
if(cnt[a]!=cnt[b])return cnt[a]>cnt[b];
else return a<b;
}
int main()
{
int n,m,k;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&k);
if(i==0)
{
value[num++]=k;
hashtable[k]=true;
cnt[k]++;
continue;
}
printf("%d:",k);
for(int j=0;j<num;j++)
{
printf(" %d",value[j]);
}
printf("\n");
if(hashtable[k]==false)
{
value[num++]=k;
hashtable[k]=true;
cnt[k]++;
}
else
{
cnt[k]++;
}
sort(value,value+num,cmp);
if(num==m+1)
{
hashtable[value[--num]]=false;
value[num]=0;
}
}
}