解题:一开始想到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;
}
}
}
用树状数组也能做