【PAT甲级】1129 Recommendation System (25分)(维护出现频率最多的K个数字,K小于等于10)
题意:
输入两个正整数N和K(N<=50000,K<=10),接着输入一行N个正整数(1~N),从第二个数开始,每次输入K个它出现在他之前的数字(包括他自己,按照出现频率降序排序,出现频率相同按照数字大小从小到大排序,如之前出现过的数字个数不到K个,则有多少输出多少)。数据保证至少有一次输出。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int a[50007]; 5 map<int,int>mp; 6 pair<int,int>pr[20]; 7 int vis[50007]; 8 bool cmp(pair<int,int>a,pair<int,int>b){ 9 if(a.first!=b.first) 10 return a.first>b.first; 11 return a.second<b.second; 12 } 13 int main(){ 14 ios::sync_with_stdio(false); 15 cin.tie(NULL); 16 cout.tie(NULL); 17 int n,k; 18 cin>>n>>k; 19 for(int i=1;i<=n;++i) 20 cin>>a[i]; 21 mp[a[1]]=1; 22 vis[a[1]]=1; 23 pr[1]={1,a[1]}; 24 int cnt=1; 25 for(int i=2;i<=n;++i){ 26 sort(pr+1,pr+1+cnt,cmp); 27 cout<<a[i]<<":"; 28 for(int j=1;j<=k;++j){ 29 if(pr[j].first==0) 30 break; 31 cout<<" "<<pr[j].second; 32 } 33 if(i<n) 34 cout<<"\n"; 35 ++mp[a[i]]; 36 if(cnt<k){ 37 if(vis[a[i]]){ 38 for(int j=1;j<=cnt;++j) 39 if(pr[j].second==a[i]) 40 ++pr[j].first; 41 } 42 else 43 pr[++cnt]={mp[a[i]],a[i]}; 44 vis[a[i]]=1; 45 } 46 else if(!vis[a[i]]){ 47 if(mp[a[i]]>pr[k].first){ 48 vis[pr[k].second]=0; 49 pr[k]={mp[a[i]],a[i]}; 50 vis[a[i]]=1; 51 } 52 else if(mp[a[i]]==pr[k].first&&a[i]<pr[k].second){ 53 vis[pr[k].second]=0; 54 pr[k]={mp[a[i]],a[i]}; 55 vis[a[i]]=1; 56 } 57 } 58 else if(vis[a[i]]) 59 for(int j=1;j<=cnt;++j) 60 if(pr[j].second==a[i]) 61 ++pr[j].first; 62 } 63 return 0; 64 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)