P1168 中位数 堆
题目描述
给出一个长度为NN的非负整数序列A_iAi,对于所有1 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A_1, A_3, …, A_{2k - 1}A1,A3,…,A2k−1的中位数。即前1,3,5,…1,3,5,…个数的中位数。
输入格式
第11行为一个正整数NN,表示了序列长度。
第22行包含NN个非负整数A_i (A_i ≤ 10^9)Ai(Ai≤109)。
输出格式
共(N + 1) / 2(N+1)/2行,第ii行为A_1, A_3, …, A_{2k - 1}A1,A3,…,A2k−1的中位数。
本题要用到优先队列定义堆:
such as:
priority_queue<int,vetor<int>,greater<int> >p1;——小根堆(扔进去的数据自动排为由小到大)
priority_queue<int,vector<int>,less<int> >p2; ——大根堆(扔进去的数据自动排为由大到小)
堆顶堆:
代码(愿以后的我能看懂):
1 #include<bits/stdc++.h> 2 using namespace std; 3 priority_queue<int,vector<int>,less<int> >p2; 4 priority_queue<int,vector<int>,greater<int> >p1; 5 int n,x; 6 int mid; 7 int main() 8 { 9 cin>>n; 10 cin>>x; 11 mid=x; 12 cout<<mid<<endl;//取中位数 13 for(int i=2;i<=n;i++) 14 { 15 cin>>x; 16 if(x<mid) 17 p2.push(x); 18 if(x>mid) 19 p1.push(x); 20 if((i-1)%2==0) 21 { 22 if(p1.size() >p2.size() ) 23 { 24 p2.push(mid); 25 mid=p1.top() ; 26 p1.pop() ; 27 } 28 if(p1.size() <p2.size() ) 29 { 30 p1.push(mid) ; 31 mid=p2.top() ; 32 p2.pop() ; 33 } 34 cout<<mid<<endl; 35 } 36 } 37 return 0; 38 }