题目来源:码蹄集
https://matiji.net/exam/brushquestion/16/3181/1DC60EA6DF83A333301CFFE1407FBA59
参考程序:
#include <iostream>
#include <cstring>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
multiset<int> s;
// 定义左指针和右指针
multiset<int>::iterator l = s.end(), r = s.end();
// 初始指向end
void addNum(int num) {
int n = s.size();
s.insert(num);
// 插入第一个元素
if(n == 0){
l = r = s.begin();
}
// 元素个数由奇数个变为偶数个
else if(n & 1){
if(num < *l){
l--;
}
else{
r++;
}
}
// 元素个数由偶数个变为奇数个
else{
if(num > *l && num < *r){
l++;
r--;
}
else if(num >= *r){
l++;
}
else{
r--;
l = r;
}
}
}
double findMedian() {
return (*l + *r) / 2.0;
}
int main() {
int n;
vector<int> num_list;
cin >> n;
while(n--) {
getchar();
char op = getchar();
int num;
if(op == '?')
cout << findMedian() << endl;
else if(op == '+') {
cin >> num;
addNum(num);
}
}
return 0;
}