这题的关键在于理解:要求第K大数,那么我们只保留前K个大数,并且按降序排列。这也就是说每加入一个数就找到这个数的位置。
然后将大于K个元素之外的数删除。
利用优先级队列就可以很好的做到这一点。
下面的代码中用到了两种优先级队列的写法。注释的和非注释的都可。并且时间都是62MS。
AC代码:
#include<iostream>
#include<queue>
using namespace std;
/*
struct node
{
int tmp;
friend bool operator < (const node a,const node b)
{
return a.tmp>b.tmp;
}
};
*/
int main()
{
int n,k,i,num;
//node num;
char option;
while(scanf("%d%d",&n,&k)!=EOF)
{
//priority_queue<node> myQueue;
priority_queue<int,vector<int>,greater<int> > myQueue;
for(i=1;i<=n;i++)
{
scanf(" %c",&option);
if(option=='I')
{
scanf("%d",&num);
myQueue.push(num);
if(myQueue.size()>k)
myQueue.pop();
}
else
printf("%d\n",myQueue.top());
}
}
return 0;
}