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相关推荐

  1. POJ - 3784 Running Median(动态维护中位数)

    题目链接:点击查看 题目大意:给出n个数,依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数 题目分析:动态维护中位数,我们可以直接用两个二叉堆来维护,一个是小顶 ...

  2. HDU 3282 Running Median 动态中位数,可惜数据范围太小

    Running Median Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  3. 专题突破二之优先队列、st表——,Running Median,Sequence,Buy Low Sell High,数据备份,超级钢琴,ZQC的手办

    文章目录 Running Median Sequence Buy Low Sell High [APIO/CTSC 2007] 数据备份 [NOI2010] 超级钢琴 「LibreOJ β Round ...

  4. 【每日一题】4月9日题目精讲 Running Median

    文章目录 题目: 题意: 题解一: 题解二: 题目: –>链接<- 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 65536K,其他语言131072K 64bit IO ...

  5. poj3784 Running Median查找中位数

    参考http://blog.csdn.net/sdfzyhx/article/details/52735387 凡是关于排序,可以考虑优先队列. #include<cstdio> #inc ...

  6. 【POJ3784】Running Median(中位数,对顶堆)

    description 输入M个数,当已输入的个数为奇数个时输出此时的中位数. 一共有M/2+1个中位数要输出,每一行10个. solution 维护两个优先队列. 大根堆q1维护比当前中位数小的元素 ...

  7. 【读书笔记】《算法竞赛进阶指南》读书笔记——0x00基本算法

    to-do: 例题: POJ 1845 Sumdiv 所有的课后习题: 随缘~~~ 位运算 对于一个二进制数,通常称其最低位为第0位,从右往左依此类推. 补码 unsigned int 直接将其看作3 ...

  8. $2019$ 暑期刷题记录 $2$(基本算法专题)

    $ 2019 $ 暑期刷题记录 $ 2 $ (基本算法专题) $ by~~wch $ $ BZOJ~1958~Strange~Towers~of~Hanoi $ (动态规划,递推) 题目大意: 求有 ...

  9. 【读书笔记】《算法竞赛进阶指南》读书笔记——0x10基本数据结构

    to do(perhaps never) CH1401 后缀数组 所有课后题 栈 例题:HDU4699 Editor 维护一个整数序列的编辑器,支持以下五种操作: I x:在当前光标位置处插入一个整数 ...

最新文章

  1. opencv2读取文件夹中图片
  2. JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别
  3. golan web扫雷
  4. 不是外链没用,而是你发的外链没用
  5. GitHub:基于epoll机制的高并发聊天室,c语言实现
  6. 如何导出SAP的数据表字段和字段描述
  7. Y1066 Ble Master Client 记录
  8. 一次详细全面的***报告
  9. latex中空一整行,新的一行顶格写
  10. Flutter PageView 使用详细概述
  11. (40)FPGA面试技能提升篇(OAM与SDH协议)
  12. mysql如何创建日志_mysql中的日志
  13. 统计学习方法十:隐马尔科夫模型
  14. 在c语言三种编译预处理功能,C语言三种预处理功能
  15. mysql存储过程返回结果集_原来MySQL的存储过程也可以这么玩?
  16. 解决MarkDown打开出现:awesomium web-brower framework This view has crashed
  17. 软件测试VS软件开发哪个好?怎么选择
  18. window重命名图片不带括号
  19. leejianjun的博客 PHP生成word并可下载
  20. 计组综合练习(期末复习大题部分适用)

热门文章

  1. iOS逆向(8)-Monkey、Logos
  2. 使用Command模式实现撤销机制 (Code Project 精选翻译)
  3. 基于场景建模的自动化配置
  4. Docker容器的原理与实践(上)
  5. 在if里赋值要注意=和==的优先级,==优先于=
  6. The total number of locks exceeds the lock table s
  7. JDK1.6.0下载安装与环境配置
  8. 得到弹出菜单QMenu的高度
  9. BCH DEVCON 黑客马拉松即将登陆旧金山!
  10. ORCAD常用元件库说明