博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【洛谷】【堆】P1168 中位数
阅读量:5300 次
发布时间:2019-06-14

本文共 1327 字,大约阅读时间需要 4 分钟。

【题目描述:】

给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数。即前1,3,5,……个数的中位数。

【输入格式:】

输入文件median.in的第1行为一个正整数N,表示了序列长度。

第2行包含N个非负整数A[i] (A[i] ≤ 10^9)。

【输出格式:】

输出文件median.out包含(N + 1) / 2行,第i行为A[1], A[3], …, A[2i – 1]的中位数。

输入样例#1: 71 3 5 7 9 11 6输出样例#1: 1356
输入输出样例

 

【算法分析:】

开一个大根堆一个小根堆,

小根堆里放大数,大根堆里放小数,保证两个堆的大小差值小于等于1

这样最后元素个数多的堆的堆顶就是中位数。

读入数列a,把a1 push进大根堆

对于a中的每一个数:

  如果比大根堆的堆顶大就放进小根堆

  否则放进大根堆

为了保证两个堆中的元素个数相差小于等于1

  不停地把元素多的堆的堆顶push到元素少的堆里去

最后元素多的堆的堆顶便是数列的中位数

 

【代码:】

1 //中位数 2 #include
3 #include
4 #include
5 #include
6 #include
7 using namespace std; 8 9 const int MAXN = 100000 + 1;10 11 int n, a[MAXN];12 priority_queue
q1;13 priority_queue
, greater
> q2;14 15 int main() {16 scanf("%d", &n);17 for(int i = 1; i <= n; i++) scanf("%d", &a[i]);18 q1.push(a[1]);19 printf("%d\n", a[1]);20 for(int i = 2; i <= n; i++) {21 if(a[i] > q1.top()) q2.push(a[i]);22 else q1.push(a[i]);23 while(abs(q1.size() - q2.size()) > 1) {24 if(q1.size() > q2.size()) q2.push(q1.top()), q1.pop();25 else q1.push(q2.top()), q2.pop();26 }27 if(i & 1) {28 if(q1.size() > q2.size()) printf("%d\n", q1.top());29 else printf("%d\n", q2.top());30 }31 }32 }

 

转载于:https://www.cnblogs.com/devilk-sjj/p/9031044.html

你可能感兴趣的文章
【模考】2018.03.10 图
查看>>
转发《离职引发的诸多感触 》
查看>>
C语言中printf和cprintf有什么区别啊
查看>>
Log4j log for java(java的日志) 的使用
查看>>
java.split();用法
查看>>
Python全栈 Web(概述、HTML基础语法)
查看>>
Mongodb----基础
查看>>
【转载】Xcode6中添加pch文件
查看>>
英语学习第一周
查看>>
java正则表达式详解与应用(学习必备)
查看>>
人民币对澳元汇率的大数据分析与预测
查看>>
会话管理
查看>>
ata
查看>>
VIM
查看>>
计算分页数据的算法
查看>>
Vim常用命令
查看>>
hdu1798: Tell me the area
查看>>
jquery的$().each,$.each的区别
查看>>
Apache Commons 工具集使用简介
查看>>
jquery validation插件
查看>>