HDU - 3282 优先队列的使用
题意:
按照顺序给你n个数,当数的数量是奇数的时候就输出它们的中位数
题解:
优先队列默认是大顶堆,即priority_queue.top()是这个队列中的最大值
那么我们就可以先创造一个大顶堆优先队列qmax,和一个小顶堆qmin
qmin里面放的是大于等于中位数的数,qmax里面放的是比中位数小的数
因为qmin是小顶堆,那么qmin.top()肯定就是中位数
(上面的话是在中位数的前提下)
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int t; 6 scanf("%d",&t); 7 while(t--) 8 { 9 priority_queue<int > qmax; //大顶堆 10 priority_queue<int ,vector<int > ,greater <int > >qmin; //小顶堆 11 int cnt; 12 int n; 13 scanf("%d%d",&cnt,&n); 14 printf("%d %d\n",cnt,(n/2+1)); 15 for(int i=1;i<=n;i++) 16 { 17 int mid; 18 scanf("%d",&mid); 19 if(qmin.size()==0) 20 qmin.push(mid); 21 else 22 { 23 if(mid>qmin.top()) 24 qmin.push(mid); 25 else qmax.push(mid); 26 } 27 while(qmin.size()!=qmax.size() && qmin.size()!=qmax.size()+1) //这两个条件任意一个不满足就要跳出来 28 { 29 if(qmax.size()>qmin.size()) 30 { 31 int x=qmax.top(); 32 qmax.pop(); 33 qmin.push(x); 34 } 35 else 36 { 37 int x=qmin.top(); 38 qmin.pop(); 39 qmax.push(x); 40 } 41 } 42 /* 43 经过上面的while处理后,qmin里面放的是大于等于中位数的数,qmax里面放的是比中位数小的数 44 因为qmin是小顶堆,那么qmin.top()肯定就是中位数 45 (上面的话是在中位数的前提下) 46 */ 47 if(i&1) 48 cout << qmin.top(); 49 if((i+1)%20==0||i==n) 50 cout << endl; 51 else if(i&1) 52 cout << " "; 53 } 54 } 55 return 0; 56 }