Running Median_via牛客网

题目

链接:https://ac.nowcoder.com/acm/contest/28886/1002
来源:牛客网

时间限制:C/C++ 5秒,其他语言10秒
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld

题目描述

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.

输入描述:

The first line of input contains a single integer P(1≤P≤1000)P(1 \leq P  \leq 1000)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)M (1  \leq M  \leq 9999)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.

输出描述:

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.

示例1

输入

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

输出

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

题解

这道题目显然不能使用一直排序来求.

在这道题目里, 引起变化的是每时每刻插入一个新的数据,原先的处理结果要放着,而不是直接丢弃.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ufgoW5sT-1644974468179)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20220216081831684.png)]

我认为如果是把中位数放到外面,就会引起一系列的不方便,还不如放到里面.

假想
在这里插入图片描述

代码

#include <iostream>
#include <queue>
#include <vector>

using namespace std;
int print_cnt = 0;
priority_queue<int, vector<int>, greater<int> >q2;
priority_queue<int, vector<int>, less<int> >q1;
vector<int>v;
inline void print()
{
	for (auto it = v.begin(); it != v.end(); it++)
	{
		if (print_cnt >= 10)
		{
			cout << endl;
			print_cnt = 0;
		}
		cout << *it << ' ';
		print_cnt++;
	}
	
		

}
inline void init()
{
	priority_queue<int, vector<int>, greater<int> >q2_;
	priority_queue<int, vector<int>, less<int> >q1_;
	print_cnt = 0;
	q1.swap(q1_);
	q2.swap(q2_);
	v.clear();
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int T;
	cin >> T;
	while (T--)
	{
		init();
		int data_no;
		int n;
		cin >> data_no >> n;
		for (int i = 0; i < n; i++)
		{
			int tmp;
			cin >> tmp;
			if (q1.empty() && q2.empty())
				q1.push(tmp);
			else if (!q1.empty())
			{
				if (tmp > q1.top())
					q2.push(tmp);
				else
					q1.push(tmp);
			}
			while (q1.size() >= q2.size() + 2)
			{
				q2.push(q1.top());
				q1.pop();
			}
			while (q1.size()+2 <= q2.size())
			{
				q1.push(q2.top());
				q2.pop();
			}
			if (!(i % 2))
			{
				if (q2.size() > q1.size())
					v.push_back(q2.top());
				else
					v.push_back(q1.top());
			}
		}
		cout << data_no <<' ' << ((n + 1) / 2) << endl;
		print();
		cout << endl;

	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值