题目不多分析了,做题的时候第一思路就是排序,但想着PAT这尿性50000个数据做50000次排序肯定超时,然后发现只需输出最多10个数,想起了用淘汰+部分排序的思想,AC~
只是做完后发现大佬们都用set实现。。。不知优劣,仅供参考~
/***************2019.9.4-15:35-16:11**************/
//A1129 Recommendation System (25 分) 45min
//题目分析:
//算法思想:不知道什么思想,淘汰算法?部分排序
//遇到的问题:
#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
#include<string>
#include<string.h>
using namespace std;
int freq[50008]={};
bool inans[50008]={};
bool cmp(int a,int b){
if(freq[a]!=freq[b]) return freq[a]>freq[b];
else return a<b;
}
int main(){
int i,j;
int K,N,query;
scanf("%d%d",&N,&K);
int ans[K];
for(i=0;i<K;i++) ans[i]=50001;//因为N最大为50000,故设500001为不存在
freq[50001]=-1;//同样设不存在的次数为-1,恒小
scanf("%d",&query);//第一个先输入,因为没输出
freq[query]++;
inans[query]=1;
ans[0]=query;
for(i=1;i<N;i++){
scanf("%d",&query);
sort(ans,ans+K,cmp);
if(ans[0]!=50001) printf("%d:",query);
j=0;
while(ans[j]!=50001&&j<K) printf(" %d",ans[j++]);
printf("\n");
freq[query]++;
if(inans[query]==0){//没在里边,判与ans中最后一个A做替换
if(ans[K-1]==50001||freq[ans[K-1]]<freq[query]
||(freq[ans[K-1]]==freq[query]&&query<ans[K-1])){
//A不存在 ||A比query频次低||频次相等下A>query
inans[ans[K-1]]=0;
ans[K-1]=query;
inans[query]=1;
}
}
}
return 0;
}