zoukankan      html  css  js  c++  java
  • 【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<<"
    ";
    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 }
  • 相关阅读:
    个人博客作业-软件案例分析
    个人项目
    个人博客作业
    软件工程作业一
    BUAAOO第四单元总结
    BUAAOO第三单元总结
    BUAAOO第二单元总结之电梯问题
    BUAAOO第一单元的总结
    个人总结
    第三次个人编程作业
  • 原文地址:https://www.cnblogs.com/ldudxy/p/12644749.html
Copyright © 2011-2022 走看看