P1168 中位数
题面:https://www.luogu.org/problemnew/show/P1168
本题即用两个堆来处理,一个大根堆和一个小根堆,大根堆中存数列中较小的那一半数值,小根堆中存数列中较大的那一半数值,然后输出中间的数即为中位数.
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<queue>
using namespace std;
priority_queue<int,vector<int> > Q;
priority_queue<int,vector<int>,greater<int> > q;
int x,n,a;
int main(){
scanf("%d%d",&n,&x);
Q.push(x);
printf("%d\n",x);
for(int i=2;i<=n;i++){
scanf("%d",&a);
if(a>Q.top()){
q.push(a);
}
else{
Q.push(a);
}
int length=Q.size()-q.size();
while(abs(length)>1){
if(Q.size()>q.size()){
q.push(Q.top());
Q.pop();
}
else{
Q.push(q.top());
q.pop();
}
length=Q.size()-q.size();
}
if(i%2==1){
if(Q.size()>q.size()){
printf("%d\n",Q.top());
}
else{
printf("%d\n",q.top());
}
}
}
return 0;
}