题意
输入一些数,进行多次查询。每次查询都是查询第K大元素是什么。
题解
这道题考察的是堆(优先队列)的应用。。。。核心代码10行,主要是考察思想。既然每次都是查询第K大元素,那么就做一个最小堆,大小为K。每次增加元素都尝试放入这个最小堆,如果新增加的元素比这个最小堆的最小值要大,则把新元素插入最小堆,并将移除原来的最小值。这样的话,每次取出来的最小值就是第K大的元素。
额外的尝试
c++ STL 有个nth-element,利用类似快排的思想,查找第N个小的数,并把比他小的放在前面,比他大的放在后面(随机顺序)。很可惜,这种算法效率还不够高,TLE。。。
代码
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<string>
#include<set>
#include<map>
#define UP(i,l,h) for(int i=l;i<h;i++)
#define DOWN(i,h,l) for(int i=h;i>l;i--)
#define W(a) while(a)
#define INF 0x3f3f3f3f
using namespace std;
priority_queue<int,vector<int>,greater<int>> que;
int main() {
int n,k;
while(~scanf("%d%d",&n,&k)) {
while(!que.empty()){
que.pop();
}
int pos=0;
W(n--) {
char ch[10];
scanf("%s",ch);
if(strcmp(ch,"I")==0) {
int x;
scanf("%d",&x);
if(que.size()<k) {
que.push(x);
} else if(que.top()<x){
que.pop();
que.push(x);
}
}else{
printf("%d\n",que.top());
}
}
}
return 0;
}