堆--P1168 中位数
Posted very-beginning
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆--P1168 中位数相关的知识,希望对你有一定的参考价值。
题目描述
给出一个长度为N的非负整数序列Ai?,对于所有1≤k≤(N+1)/2,输出A1,A3,…,A2k−1的中位数。即前1,3,5,…个数的中位数。
输入格式
第1行为一个正整数N,表示了序列长度。
第2行包含N个非负整数Ai(Ai≤109)。
输出格式
共(N+1)/2行,第i行为A1,A3,…,A2k−1?的中位数。
首先记录一个变量mid,记录答案(中位数)。建立两个堆,一个大根堆一个小根堆,大根堆存≤mid的数,小根堆存 >mid的的数。
所以我们向堆中加入元素时,就通过与mid的比较,选择加入哪一个堆
但我们在输出答案前需要对mid进行调整,如果小根堆和大根堆内元素相同,就无需处理,此时mid仍然是当前的中位数。
如果两个堆中元素个数不同,那我们就需要进行调整。
1 #include <cstdio> 2 #include <iostream> 3 #include <queue> 4 #include <algorithm> 5 using namespace std; 6 int n; 7 int a[100000]; 8 int mid; 9 priority_queue <int,vector<int>,less<int> >q1; 10 priority_queue <int,vector<int>,greater<int> >q2; 11 int main() 12 { 13 scanf ("%d",&n); 14 scanf ("%d",&a[1]); 15 mid=a[1]; 16 printf ("%d ",mid); 17 for (int i = 2;i <= n;i++) 18 { 19 scanf ("%d",&a[i]); 20 if (a[i]>mid) q2.push(a[i]); 21 else q1.push(a[i]); 22 if (i%2==1) 23 { 24 while (q1.size()!=q2.size()) 25 { 26 if(q1.size()>q2.size()){ 27 q2.push(mid); 28 mid=q1.top(); 29 q1.pop(); 30 } 31 else{ 32 q1.push(mid); 33 mid=q2.top(); 34 q2.pop(); 35 } 36 } 37 cout<<mid<<endl; 38 } 39 } 40 return 0; 41 }
以上是关于堆--P1168 中位数的主要内容,如果未能解决你的问题,请参考以下文章