POJ 3784 Running Median
来源:互联网 发布:mac wifi管理软件 编辑:程序博客网 时间:2024/05/22 07:51
Description
For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (middle value) of the elements received so far.
Input
The first line of input contains a single integer P, (1 ≤ P ≤ 1000), which is the number of data sets that follow. The first line of each data set contains the data set number, followed by a space, followed by an odd decimal integer M, (1 ≤ M ≤ 9999), giving the total number of signed integers to be processed. The remaining line(s) in the dataset consists of the values, 10 per line, separated by a single space. The last line in the dataset may contain less than 10 values.
Output
For each data set the first line of output contains the data set number, a single space and the number of medians output (which should be one-half the number of input values plus one). The output medians will be on the following lines, 10 per line separated by a single space. The last line may have less than 10 elements, but at least 1 element. There should be no blank lines in the output.
Sample Input
3
1 9
1 2 3 4 5 6 7 8 9
2 9
9 8 7 6 5 4 3 2 1
3 23
23 41 13 22 -3 24 -31 -11 -8 -7
3 5 103 211 -311 -45 -67 -73 -81 -99
-33 24 56
Sample Output
1 5
1 2 3 4 5
2 5
9 8 7 6 5
3 12
23 23 22 22 13 3 5 5 3 -3
-7 -3
【分析】
二叉堆维护
分别维护一个大根堆和一个小根堆。
操作:如果比当前中位数k大的话那么进小根堆,反之进大根堆
维护:小根堆元素比大根堆元素多一个
具体做法:两个两个的加元素
用到了C++的STL,很省代码长度
【代码】
//poj 3784 Running Median#include<iostream>#include<cstdio>#include<queue>#include<algorithm>#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;priority_queue <int> da;priority_queue < int,vector<int>,greater<int> > xiao;int Q,n,x,y,t;int a[5001];bool b;int main(){ int i,j,k,p,f,d; //k为中位数 scanf("%d",&Q); while(Q--) { t=0;b=0; scanf("%d%d%d",&d,&n,&x); if(n%2==0) b=1; k=x; a[++t]=k; xiao.push(k); fo(i,1,(n-1)/2) { scanf("%d%d",&x,&y); if(x>=k) xiao.push(x); else da.push(x); if(y>=k) xiao.push(y); else da.push(y); while(xiao.size()!=da.size()+1 && xiao.size()>da.size()) //如果小根堆大 { p=xiao.top(); xiao.pop(); da.push(p); } while(xiao.size()!=da.size()+1 && da.size()>xiao.size()) //如果大根堆大 { p=da.top(); da.pop(); xiao.push(p); } k=xiao.top(); a[++t]=k; } if(b) scanf("%d",&x); printf("%d %d\n",d,(n+1)>>1); fo(i,1,t) { printf("%d ",a[i]); if(i%10==0) printf("\n"); } printf("\n"); while(!xiao.empty()) xiao.pop(); while(!da.empty()) da.pop(); } return 0;}
- POJ 3784 Running Median
- POJ 3784 Running Median
- POJ 3784 Running Median
- POJ 3784 Running Median
- POJ 3784 Running Median
- poj 3784 Running Median
- poj 3784 Running Median/sbt
- poj 3784 Running Median 二叉堆
- POJ 3784.Running Median
- POJ 3784 Running Median 对顶堆算法
- POJ 3784 Running Median 动态求中位数 堆
- POJ 3784 Running Median简单版本可AC
- POJ 3784 Running Median 动态求中位数 堆
- poj3784 Running Median
- HDU 3282-Running Median
- Median POJ
- hdu3282 Running Median(排序)
- (中分+vector) Running Median(P3784)
- leetcode ZigZag Conversion
- JVM内存区域
- ARM 必须知道的知识
- 文本查询程序
- 《机器学习》周志华习题4.3答案
- POJ 3784 Running Median
- MyEclipse破解失败的解决办法 ---谷营中西
- 针对MYSQL delete、update、insert语句误操作时的恢复办法
- linux下安装ffmpeg
- 【Arduino官方教程】数字处理示例(三):按键防抖
- linux下的C语言开发(gdb调试)
- logstash实现日志文件同步到elasticsearch深入详解
- c++ 子类“重载”父类的方法
- ADS下的分散加载文件应用实例