给出一个长度为奇数 NN 的非负整数序列 A_iA
i
,对于所有 1 \le k \le {(N + 1)\over 2}1≤k≤
2
(N+1)
,输出 A_1, A_3, \ldots, A_{2k - 1}A
1
,A
3
,…,A
2k−1
的中位数,即前 1,3,5,\ldots1,3,5,… 个数的中位数。
输入格式
第一行一个奇数 N\ (1\le N \le 99999)N (1≤N≤99999)。
第二行 NN 个空格分隔的正整数 A_i\ (1\le A_i \le 10^9)A
i
(1≤A
i
≤10
9
)。
输出格式
共 {(N + 1)\over 2}
2
(N+1)
行,第 ii 行为A_1, A_3, \ldots, A_{2i - 1}A
1
,A
3
,…,A
2i−1
的中位数。
输出时每行末尾的多余空格,不影响答案正确性
样例输入复制
7
1 3 5 7 9 11 6
样例输出复制
1
3
5
6
采用优先队列,有大根堆保存中位数左边的数字,用小根堆保存中位数右边的数字
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int main(){
int n;
cin >>n;
priority_queue<int,vector<int>,greater<int> > small;//小根堆,存储后半部分
priority_queue<int,vector<int>,less<int> > big;//大根堆
vector<int> ans;
int x;
cin >> x;
ans.push_back(x);
big.push(x);
for(int i=2;i<=n;i++){
cin >> x;
//如果
if(x>big.top()){
small.push(x);
}else{
big.push(x);
}
//维持平衡,两者的数字个数差值为1个即可
while(big.size()>small.size()+1 || small.size()>big.size()+1){
if(big.size()>small.size()){
small.push(big.top());
big.pop();
}
if(small.size()>big.size()){
big.push(small.top());
small.pop();
}
}
if(i%2==1){
//奇数
if(big.size()>small.size()){
ans.push_back(big.top());
}else{
ans.push_back(small.top());
}
}
}
for(int i=0;i<ans.size();i++){
cout<<ans[i]<<endl;
}
return 0;
}