#include<iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<algorithm> #include<map> #include<vector> #include<queue> #include<set> using namespace std; //符号重载的node结构体作为set的元素自动排序,每次推荐set中的前k项 //book[num]标记num出现的次数 //注意先不处理输入的数字,根据之前的数据输出前K再存刚才新数据 int book[50001]; struct node{ int value,cnt; bool operator<(const node &a)const{ return (cnt!=a.cnt)?cnt>a.cnt:value<a.value; //第一优先级:频率降次 第二优先级:编号 } }; int main(){ int n,k,num; scanf("%d%d",&n,&k);//查询n次,每次推荐k个 set<node>s; for(int i=0;i<n;i++){ scanf("%d",&num); if(i!=0){ printf("%d:",num); int tempCnt=0; //tempCnt累计小于k for(auto it=s.begin();tempCnt<k&&it!=s.end();it++){ printf(" %d",it->value); tempCnt++; } printf("\n"); } struct node a={num,book[num]}; auto it=s.find(a);//返回a在set中对应的指针 if(it!=s.end()) s.erase(it); //如果a结构体存在就先删除 book[num]++; struct node b={num,book[num]}; //重新插入新的num结构体 s.insert(b); } system("pause"); return 0; }