POJ 3784.Running Median
2015-07-16
问题简述:
动态求取中位数的问题,输入一串数字,每输入第奇数个数时求取这些数的中位数。
原题链接:http://poj.org/problem?id=3784
解题思路:
求取中位数的方法常常想到使用堆来实现:取一个大顶堆,一个小顶堆,使大顶堆的堆顶记录中位数,因此,要时刻保持大顶堆堆顶元素小于小顶堆堆顶元素,且大顶堆元素个数等于小顶堆元素个数或等于小顶堆元素个数加一。
以下有两种堆得实现方法:
一:直接使用STL中的函数(make_heap,push_heap,pop_heap,sort_heap)实现堆;
二:使用优先队列(priority_queue)实现堆;
方法一源码:
1 /* 2 OJ: POJ 3 ID: 3013216109 4 TASK: 3784.Running Median 5 LANG: C++ 6 NOTE: 堆(STL) 7 */ 8 #include <cstdio> 9 #include <algorithm> 10 using namespace std; 11 12 const int MAX=10005; 13 int a[MAX],b[MAX],c[MAX]; 14 15 bool cmp(int a,int b) { 16 return a>b; 17 } 18 19 int main() 20 { 21 int t,n,m,x; 22 scanf("%d",&t); 23 while(t--) { 24 scanf("%d %d",&n,&m); 25 int a_len=0,b_len=0,k=0,i=0; 26 while(m--) { 27 i++; 28 scanf("%d",&x); 29 if(a_len==0) { 30 a[0]=x; 31 c[k++]=x; 32 a_len++; 33 continue; 34 } 35 36 if(x<=a[0]) { 37 a[a_len++]=x; 38 push_heap(a,a+a_len); 39 } 40 else { 41 b[b_len++]=x; 42 push_heap(b,b+b_len,cmp); 43 } 44 45 while(a_len>b_len+1) { 46 b[b_len++]=a[0]; 47 pop_heap(a,a+a_len); 48 a_len--; 49 push_heap(b,b+b_len,cmp); 50 } 51 while(a_len<b_len) { 52 a[a_len++]=b[0]; 53 pop_heap(b,b+b_len,cmp); 54 b_len--; 55 push_heap(a,a+a_len); 56 } 57 58 if(i%2==1) 59 c[k++]=a[0]; 60 } 61 62 printf("%d %d\n",n,k); 63 for(int i=0;i<k;i++) { 64 if(i>0&&i%10==0) putchar('\n'); 65 if(i%10) putchar(' '); 66 printf("%d", c[i]); 67 } 68 printf("\n"); 69 } 70 return 0; 71 }
方法二源码:
1 /* 2 OJ: POJ 3 ID: 3013216109 4 TASK: 3784.Running Median 5 LANG: C++ 6 NOTE: 堆(优先队列) 7 */ 8 #include <cstdio> 9 #include <queue> 10 #define MAX 10005 11 using namespace std; 12 13 priority_queue<int,vector<int>,less<int> > a; //大顶堆 14 priority_queue<int,vector<int>,greater<int> > b; //小顶堆 15 vector<int> c; 16 17 int main() 18 { 19 int t,n,m,x; 20 scanf("%d",&t); 21 while(t--) { 22 scanf("%d %d",&n,&m); 23 while(!a.empty()) a.pop(); 24 while(!b.empty()) b.pop(); 25 c.clear(); 26 for(int i=0;i<m;i++) { 27 scanf("%d",&x); 28 if(a.empty()) { 29 a.push(x); 30 c.push_back(x); 31 continue; 32 } 33 if(x<=a.top()) 34 a.push(x); 35 else 36 b.push(x); 37 38 while(a.size()>b.size()+1) { 39 b.push(a.top()); 40 a.pop(); 41 } 42 while(a.size()<b.size()) { 43 a.push(b.top()); 44 b.pop(); 45 } 46 47 if(i%2==0&&i!=0) 48 c.push_back(a.top()); 49 } 50 51 printf("%d %d\n",n,(m+1)/2); 52 for(int i=0;i<c.size();i++) { 53 if(i>0&&i%10==0) putchar('\n'); 54 if(i%10) putchar(' '); 55 printf("%d", c[i]); 56 } 57 printf("\n"); 58 } 59 return 0; 60 }
转载于:https://www.cnblogs.com/ACMans/p/4650247.html
POJ 3784.Running Median相关推荐
- POJ - 3784 Running Median(动态维护中位数)
题目链接:点击查看 题目大意:给出n个数,依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数 题目分析:动态维护中位数,我们可以直接用两个二叉堆来维护,一个是小顶 ...
- HDU 3282 Running Median 动态中位数,可惜数据范围太小
Running Median Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- 专题突破二之优先队列、st表——,Running Median,Sequence,Buy Low Sell High,数据备份,超级钢琴,ZQC的手办
文章目录 Running Median Sequence Buy Low Sell High [APIO/CTSC 2007] 数据备份 [NOI2010] 超级钢琴 「LibreOJ β Round ...
- 【每日一题】4月9日题目精讲 Running Median
文章目录 题目: 题意: 题解一: 题解二: 题目: –>链接<- 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 65536K,其他语言131072K 64bit IO ...
- poj3784 Running Median查找中位数
参考http://blog.csdn.net/sdfzyhx/article/details/52735387 凡是关于排序,可以考虑优先队列. #include<cstdio> #inc ...
- 【POJ3784】Running Median(中位数,对顶堆)
description 输入M个数,当已输入的个数为奇数个时输出此时的中位数. 一共有M/2+1个中位数要输出,每一行10个. solution 维护两个优先队列. 大根堆q1维护比当前中位数小的元素 ...
- 【读书笔记】《算法竞赛进阶指南》读书笔记——0x00基本算法
to-do: 例题: POJ 1845 Sumdiv 所有的课后习题: 随缘~~~ 位运算 对于一个二进制数,通常称其最低位为第0位,从右往左依此类推. 补码 unsigned int 直接将其看作3 ...
- $2019$ 暑期刷题记录 $2$(基本算法专题)
$ 2019 $ 暑期刷题记录 $ 2 $ (基本算法专题) $ by~~wch $ $ BZOJ~1958~Strange~Towers~of~Hanoi $ (动态规划,递推) 题目大意: 求有 ...
- 【读书笔记】《算法竞赛进阶指南》读书笔记——0x10基本数据结构
to do(perhaps never) CH1401 后缀数组 所有课后题 栈 例题:HDU4699 Editor 维护一个整数序列的编辑器,支持以下五种操作: I x:在当前光标位置处插入一个整数 ...
最新文章
- opencv2读取文件夹中图片
- JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别
- golan web扫雷
- 不是外链没用,而是你发的外链没用
- GitHub:基于epoll机制的高并发聊天室,c语言实现
- 如何导出SAP的数据表字段和字段描述
- Y1066 Ble Master Client 记录
- 一次详细全面的***报告
- latex中空一整行,新的一行顶格写
- Flutter PageView 使用详细概述
- (40)FPGA面试技能提升篇(OAM与SDH协议)
- mysql如何创建日志_mysql中的日志
- 统计学习方法十:隐马尔科夫模型
- 在c语言三种编译预处理功能,C语言三种预处理功能
- mysql存储过程返回结果集_原来MySQL的存储过程也可以这么玩?
- 解决MarkDown打开出现:awesomium web-brower framework This view has crashed
- 软件测试VS软件开发哪个好?怎么选择
- window重命名图片不带括号
- leejianjun的博客 PHP生成word并可下载
- 计组综合练习(期末复习大题部分适用)
热门文章
- iOS逆向(8)-Monkey、Logos
- 使用Command模式实现撤销机制 (Code Project 精选翻译)
- 基于场景建模的自动化配置
- Docker容器的原理与实践(上)
- 在if里赋值要注意=和==的优先级,==优先于=
- The total number of locks exceeds the lock table s
- JDK1.6.0下载安装与环境配置
- 得到弹出菜单QMenu的高度
- BCH DEVCON 黑客马拉松即将登陆旧金山!
- ORCAD常用元件库说明