📅  最后修改于: 2023-12-03 15:22:21.020000             🧑  作者: Mango
本程序使用STL实现了对于输入的整数流的中位数运算。其中使用了两个堆来分别保存输入的整数流的前半段和后半段,并保证前半段中的最大值小于后半段中的最小值。
本程序使用了C++ STL中的以下数据结构:
具体地,我们使用两个堆,一个最大堆和一个最小堆,分别保存输入的整数流的前半段和后半段。在每次读入一个整数之后,我们需要判断两个堆的大小,将其加入到合适的堆中,并保证前半段中的最大值小于后半段中的最小值。在求解中位数时,我们需要检查两个堆的大小,如果它们的大小相等,则中位数为两个堆顶的平均值,如果前半段比后半段多一个元素,则中位数为前半段中的最大值。
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int main() {
priority_queue<int, vector<int>, less<int>> left_heap; // 最大堆
priority_queue<int, vector<int>, greater<int>> right_heap; // 最小堆
vector<int> nums; // 存储输入流的数组
int N, i = 0;
scanf("%d", &N);
nums.resize(N);
while (i < N) {
int x;
scanf("%d", &x);
nums[i++] = x;
if (left_heap.empty() || x <= left_heap.top()) {
left_heap.push(x);
} else {
right_heap.push(x);
}
if (left_heap.size() > right_heap.size() + 1) {
right_heap.push(left_heap.top());
left_heap.pop();
} else if (right_heap.size() > left_heap.size()) {
left_heap.push(right_heap.top());
right_heap.pop();
}
if (i % 2 == 0) {
printf("%d\n", left_heap.top());
} else {
if (left_heap.size() == right_heap.size()) {
printf("%d\n", (left_heap.top() + right_heap.top()) / 2);
} else {
printf("%d\n", left_heap.top());
}
}
}
return 0;
}
其中,left_heap对应前半段,right_heap对应后半段,实现了对的两个堆的插入、调整和中位数的计算。