POJ 3784 Running Median 解题报告 用堆动态求中位数

POJ 3784 Running Median 解题报告

题意:每当输入次数为奇数时,求当前数组中的中位数。
解题思路:建两个堆,大的放一个堆,小的放一个堆,每次输入都根据大小决定放哪个堆。

#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<fstream>
#include<iomanip>
#pragma warning(disable:4996)
#define INF 0x3f3f3f3f
#define ll long long
#define PI acos(-1.0)
const int N = 1000010;
const int maxn = 1e9;
using namespace std;
priority_queue<int, vector<int>, greater<int> >q1;//头小尾大
priority_queue<int, vector<int>, less<int> >q2;//头大尾小
vector<int> g;
void Add(int temp)
{
	if (q1.empty())
	{
		q1.push(temp);
		return;
	}
	if (temp > q1.top())
		q1.push(temp);
	else
		q2.push(temp);
	while (q1.size() < q2.size())
	{
		q1.push(q2.top());
		q2.pop();
	}
	while (q1.size() > q2.size() + 1)
	{
		q2.push(q1.top());
		q1.pop();
	}
}
int main()
{
	int p,t,n,tem;
	scanf("%d", &p);
	while (p--)
	{
		while (!q1.empty())
			q1.pop();
		while (!q2.empty())
			q2.pop();
		g.clear();
		scanf("%d%d", &t, &n);
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &tem);
			Add(tem);
			if (i % 2 == 0)
				g.push_back(q1.top());
		}
		printf("%d %d\n", t, (n + 1) / 2);
		for (int i = 0; i < g.size(); i++)
		{
			if (i > 0 && i % 10 == 0)
				printf("\n");
			if (i % 10)
				printf(" ");
			printf("%d", g[i]);
		}
		printf("\n");
	}
}



发布了64 篇原创文章 · 获赞 0 · 访问量 1455

猜你喜欢

转载自blog.csdn.net/weixin_45566331/article/details/104642636