福明o7 @ 2022-03-16 12:18:12
代码:
#include<bits/stdc++.h>
#define resh_umbrella return 0
using namespace std;
int n;
int x;//一个临时读入数据的变量
priority_queue<int> q1;//大根堆
priority_queue<int,vector<int>,greater<int> >q2;//小根堆
int main(){
scanf("%d",&n);
scanf("%d",&x);
printf("%d\n",x);//第一个数据的特判
q1.push(x);
for(int i=2;i<=n;i++){//开始遍历
scanf("%d",&x);
if(x>q1.top()){//如果该数据大于大根堆的顶部(即读入了当前的最大值)
q2.push(x);//用小根底保留(修复)
}
else{
q1.push(x);
}
while(abs(q1.size()-q2.size())>1){//当两边堆大小基本不对等时(差距大于1时)
//进行平衡操作
if(q1.size()>q2.size()){
q2.push(q1.top());
q1.pop();
}
else{
q1.push(q2.top());
q2.pop();
}
}
if(i%2==1){//奇数位输出,偶数位不输出
if(q1.size()>q2.size()){
printf("%d\n",q1.top());
}
else{
printf("%d\n",q2.top());
}
}
}
resh_umbrella;
}
abs(q1.size()-q2.size())>1这行编译错误,说有歧义? 本地编辑器DEV-C++5.11 运行无误
by Wuzhijing @ 2022-03-16 12:40:48
C++的abs函数存在两种版本:在stdlib.h中的和在cmath中的。
by 福明o7 @ 2022-03-16 18:43:05
本贴已完结,问题已解决(强制转换Int即可)
by xuekaiwen_emmm @ 2023-01-02 21:26:45
懂了
问题出在size返回unsigned没有负数(大概)不能用abs这个求绝对值