题目大意:
给定一系列的数,并能够不断往里添加数使这个序列得到更新,问第k大的数是几
这里可以用两种方法来做:
1.运用优先队列将其由小到大保存,令队列里的数据始终只有k个,那么队首元素就是最小值
2.运用堆排列,同样也只是在堆中存放k个元素,将最小值的位置放在堆顶,当超过k个的元素加入时,如果加入的数大于堆顶位置对应的元素,那么将那个数位置上的数更新掉并重排堆,如果小于就不管它了。
优先队列
1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 #include <iostream> 5 using namespace std; 6 7 int main() 8 { 9 int n,k,x; 10 char c; 11 while(scanf("%d%d",&n,&k)!=EOF){ 12 priority_queue<int,vector<int>,greater<int> > q; 13 for(int i=0;i<n;i++){ 14 cin>>c; 15 if(c=='I'){ 16 scanf("%d",&x); 17 q.push(x); 18 int len=q.size(); 19 if(len>k) q.pop(); 20 } 21 else printf("%d\n",q.top()); 22 } 23 } 24 return 0; 25 }