题目要求每次输出中间的那个数,如果数据很大肯定扛不住;
所以用两个优先队列来维护;
这样的话中间的那个数反正会在两个队列的任何一个的头部;
时间复杂度肯定比较小;
代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <cstdio> 2 #include <queue> 3 using namespace std; 4 int l1,l2; 5 priority_queue<int> q1; 6 priority_queue<int, vector<int>, greater<int> > q2; 7 void add(int x) 8 { 9 q2.push(x); 10 l2++; 11 if(!q1.empty() && !q2.empty()) 12 { 13 while(q1.top()>q2.top()) 14 { 15 x=q1.top(); 16 q1.pop(); 17 q1.push(q2.top()); 18 q2.pop(); 19 q2.push(x); 20 } 21 } 22 if(q1.size()<q2.size()) 23 { 24 x=q2.top(); 25 q1.push(x); 26 q2.pop(); 27 l1++; 28 l2--; 29 } 30 } 31 int get() 32 { 33 int ret; 34 if(l1>l2) 35 { 36 l1--; 37 ret=q1.top(); 38 q1.pop(); 39 } 40 else 41 { 42 l2--; 43 ret=q2.top(); 44 q2.pop(); 45 } 46 return ret; 47 } 48 49 int main() 50 { 51 char str[15]; 52 int x; 53 while(scanf("%s",str)!=EOF) 54 { 55 if(str[0]=='#') 56 printf("%d\n",get()); 57 else 58 { 59 sscanf(str,"%d",&x); 60 add(x); 61 } 62 } 63 return 0; 64 }