POJ 3784.Running Median
2015-07-16
问题简述:
动态求取中位数的问题,输入一串数字,每输入第奇数个数时求取这些数的中位数。
原题链接:http://poj.org/problem?id=3784
解题思路:
求取中位数的方法常常想到使用堆来实现:取一个大顶堆,一个小顶堆,使大顶堆的堆顶记录中位数,因此,要时刻保持大顶堆堆顶元素小于小顶堆堆顶元素,且大顶堆元素个数等于小顶堆元素个数或等于小顶堆元素个数加一。
以下有两种堆得实现方法:
一:直接使用STL中的函数(make_heap,push_heap,pop_heap,sort_heap)实现堆;
二:使用优先队列(priority_queue)实现堆;
方法一源码:
/*
OJ: POJ
ID: 3013216109
TASK: 3784.Running Median
LANG: C++
NOTE: 堆(STL)
*/
#include <cstdio>
#include <algorithm>
using namespace std; const int MAX=;
int a[MAX],b[MAX],c[MAX]; bool cmp(int a,int b) {
return a>b;
} int main()
{
int t,n,m,x;
scanf("%d",&t);
while(t--) {
scanf("%d %d",&n,&m);
int a_len=,b_len=,k=,i=;
while(m--) {
i++;
scanf("%d",&x);
if(a_len==) {
a[]=x;
c[k++]=x;
a_len++;
continue;
} if(x<=a[]) {
a[a_len++]=x;
push_heap(a,a+a_len);
}
else {
b[b_len++]=x;
push_heap(b,b+b_len,cmp);
} while(a_len>b_len+) {
b[b_len++]=a[];
pop_heap(a,a+a_len);
a_len--;
push_heap(b,b+b_len,cmp);
}
while(a_len<b_len) {
a[a_len++]=b[];
pop_heap(b,b+b_len,cmp);
b_len--;
push_heap(a,a+a_len);
} if(i%==)
c[k++]=a[];
} printf("%d %d\n",n,k);
for(int i=;i<k;i++) {
if(i>&&i%==) putchar('\n');
if(i%) putchar(' ');
printf("%d", c[i]);
}
printf("\n");
}
return ;
}
方法二源码:
/*
OJ: POJ
ID: 3013216109
TASK: 3784.Running Median
LANG: C++
NOTE: 堆(优先队列)
*/
#include <cstdio>
#include <queue>
#define MAX 10005
using namespace std; priority_queue<int,vector<int>,less<int> > a; //大顶堆
priority_queue<int,vector<int>,greater<int> > b; //小顶堆
vector<int> c; int main()
{
int t,n,m,x;
scanf("%d",&t);
while(t--) {
scanf("%d %d",&n,&m);
while(!a.empty()) a.pop();
while(!b.empty()) b.pop();
c.clear();
for(int i=;i<m;i++) {
scanf("%d",&x);
if(a.empty()) {
a.push(x);
c.push_back(x);
continue;
}
if(x<=a.top())
a.push(x);
else
b.push(x); while(a.size()>b.size()+) {
b.push(a.top());
a.pop();
}
while(a.size()<b.size()) {
a.push(b.top());
b.pop();
} if(i%==&&i!=)
c.push_back(a.top());
} printf("%d %d\n",n,(m+)/);
for(int i=;i<c.size();i++) {
if(i>&&i%==) putchar('\n');
if(i%) putchar(' ');
printf("%d", c[i]);
}
printf("\n");
}
return ;
}
POJ 3784.Running Median的更多相关文章
- POJ 3784 Running Median【维护动态中位数】
Description For this problem, you will write a program that reads in a sequence of 32-bit signed int ...
- POJ 3784 Running Median(动态维护中位数)
Description For this problem, you will write a program that reads in a sequence of 32-bit signed int ...
- POJ 3784 Running Median (动态中位数)
题目链接:http://poj.org/problem?id=3784 题目大意:依次输入n个数,每当输入奇数个数的时候,求出当前序列的中位数(排好序的中位数). 此题可用各种方法求解. 排序二叉树方 ...
- POJ 3784 Running Median (模拟水过带翻译)
Description Moscow is hosting a major international conference, which is attended by n scientists fr ...
- 【POJ 3784】 Running Median (对顶堆)
Running Median Description For this problem, you will write a program that reads in a sequence of 32 ...
- hdu 3282 Running Median
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3282 Running Median Description For this problem, you ...
- HDU 3282 Running Median 动态中位数,可惜数据范围太小
Running Median Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- 【POJ3784】Running Median
Running Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3406 Accepted: 1576 De ...
- 【POJ 3784】 Running Median
[题目链接] http://poj.org/problem?id=3784 [算法] 对顶堆算法 要求动态维护中位数,我们可以将1-M/2(向下取整)小的数放在大根堆中,M/2+1-M小的数放在小根堆 ...
随机推荐
- 减小Delphi的Exe文件大小(11种方法)
一般来说,由Delphi生成的EXE文件,要比其由它编程语言生成的体积大一些.这主要是由于使用VCL的原因(当然,VCL是有许多优点的!) 以下是减小EXE文件大小的几种途径: 01) 使用加壳工具( ...
- express手工实现session原理
var express = require('express'); var cookieParser = require('cookie-parser'); var bodyParser = requ ...
- 枚举与剪枝_观察算式(比标准答案还要牛B)
观察算式 观察以下的算式: △△△ * △△ = △△△△ 某3位数乘以2位数,结果为4位数 要求:在9个△所代表的数字中.1~9的数字恰好每一个出现1次. 暴力破解代码: package lianx ...
- 二、Cocos2dx中Android部分的c++和java实现相互调用(高级篇)
本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=97 本文目的 要完成在cocos2dx的场景上一个点击事件,传递一个消息到java层,下面让我们看看 ...
- USB OTG简单介绍
1 引言 随着USB2.0版本号的公布,USB越来越流行,已经成为一种标准接口.如今,USB支持三种传输速率:低速(1.5Mb/s).全速(12Mb/s)和快速(480Mb/s),四种传输类型:块传输 ...
- selector是在文件夹drawable中进行定义的xml文件。
获取Drawable对象: Resources res = mContext.getResources(); Drawable myImage = res.getDrawable(R.drawable ...
- javascript DOM,它到底是什么-------Day32
这一晚上看的我是头疼不已啊,为什么呢? 终究是半路出家,我对javascript的理解仅仅停留在:调用javascript,改变页面样式,元素和实现一些事件的响应,尽管须要的时候可能会用,可是到底使用 ...
- VBA 简单调试
在中断模式下(ctrl+Break键),可以做: 1.执行 工具----选项----编辑器----勾选“自动显示数据提示” 则当用鼠标悬停在变量或表达式上时,会出现提示窗口,显示其名称和值! 2 ...
- ubuntu10.04 安装NVIDIA GT 420M驱动
安装ubuntu已经好几天了,由于显卡驱动没装,屏幕在600X800下的效果很难看,于是就想办法,查阅资料终于安装成功了,下面将我的安装方法记录下来以供大家参考. 借鉴:ubuntu12.04下安装N ...
- C - Wooden Sticks
C - Wooden Sticks Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...