中位数(堆的应用)

中位数 - 洛谷

解题:一开始想到sort暴力,只能过40%的数据。转而去用一个大根堆和一个小根堆去做分配

priority_queue<int,vector<int>,less<int>>q1;
priority_queue<int,vector<int>,greater<int>>q2;

然后将a[1]输出,定义mid为进入哪个堆的“裁判”,将mid初始赋值成a[1].

	if(a[i]>mid)
     	{
     		q2.push(a[i]);
		 }else q1.push(a[i]);

当为奇数时,将两个堆进行平衡,将mid设为堆顶元素。

while(q1.size()!=q2.size())
		 	{
		 		if(q1.size()>q2.size())
		 		{
		 			q2.push(mid);
		 			mid=q1.top();
		 			q1.pop();
				 }else{
				 	q1.push(mid);
				 	mid=q2.top();
				 	q2.pop();
				 }
			 }

就可以了(貌似不用mid也能过,但判断麻烦很多)

#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,less<int>>q1;
priority_queue<int,vector<int>,greater<int>>q2;
int n;
int a[100001];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
     int mid=a[1];
     cout<<mid<<endl;
     for(int i=2;i<=n;i++)
     {
     	if(a[i]>mid)
     	{
     		q2.push(a[i]);
		 }else q1.push(a[i]);
		 if(i%2==1)
		 {
		 	while(q1.size()!=q2.size())
		 	{
		 		if(q1.size()>q2.size())
		 		{
		 			q2.push(mid);
		 			mid=q1.top();
		 			q1.pop();
				 }else{
				 	q1.push(mid);
				 	mid=q2.top();
				 	q2.pop();
				 }
			 }
			 cout<<mid<<endl;
		 }
	 }
}

用树状数组也能做

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值