题意:逐步观察 输出当前出现次数最多的k个数字 按出现次数大小排序 次数相同 序号小的大
1. 码力倒退的太严重了 没有想明白用Node怎么建立索引 搜题解才知道不用建立结构体数组 直接把一个值作为索引 另外一个值放在数组外面然后放到容器中查询即可
2. 刚开始总想着用数组 但是sort自然不可能 手写插入排序在顺序表中也不方便维护 写链表更是石乐志 后来想用优先队列 但是优先队列取出元素的操作太复杂 也不能做 只能用set
#include <bits/stdc++.h>
using namespace std;
const int N=50100;
int arr[N],tim[N];
struct Node{
int id;
int num;
Node(){}
Node(int a,int b){id=a;num=b;}
bool operator<(const Node&b)const{
if(num==b.num)
return id<b.id;
return num>b.num;
}
};
/*
当前出现次数最多的k个数字 按出现次数大小排序
次数相同 序号小的大
*/
int main()
{
int n,k;
set<Node>st;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
memset(tim,0,sizeof(tim));
tim[arr[0]]++;
st.insert(Node(arr[0],tim[arr[0]]));
for(int i=1;i<n;i++)
{
printf("%d:",arr[i]);
int cnt=0;
for(auto it=st.begin();it!=st.end()&&cnt!=k;++it)
{
++cnt;
printf(" %d",it->id);
}
printf("\n");
auto it = st.find(Node(arr[i],tim[arr[i]]));
if(it!=st.end())st.erase(it);
tim[arr[i]]++;
st.insert(Node(arr[i],tim[arr[i]]));
}
return 0;
}