题目大意:

给定一系列的数,并能够不断往里添加数使这个序列得到更新,问第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 }
View Code

相关文章:

  • 2021-07-26
  • 2021-09-26
  • 2021-08-04
  • 2021-11-12
  • 2022-12-23
  • 2021-11-13
  • 2021-10-28
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-21
  • 2022-12-23
  • 2021-08-11
相关资源
相似解决方案