题目大意:两个小朋友做游戏,一个人提供两种操作,一是“I”,即存入数据data,二是“Q”,即问存入数据列中第k大的数是多少?
解题思路:利用优先队列的性质来维护这个数据序列的有序性,然后设定优先队列的宽度为k,那么当数据超出k值就弹出,这样就可以维护队列的top为第k大的值。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4006
STLcode:
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int data,n,k;
char opr;
int main()
{
priority_queue<int,vector<int>,greater<int> > q;
while(scanf("%d%d",&n,&k)!=EOF){
for(int i=0;i<n;i++){
cin>>opr;
if(opr=='I'){
cin>>data;
if(q.size()<k) q.push(data);
else if(data > q.top()) {q.pop(); q.push(data);}
}
else if(opr=='Q'){
cout<<q.top()<<endl;
}
}
while(!q.empty()){
q.pop();
}
}
return 0;
}