中位数

发布时间 2024-01-06 11:49:29作者: Boy^
#include <cstdio>
#include <queue>
using namespace std;

/*
首先,程序提示用户输入一个整数n,表示接下来要输入的整数的数量。
接着,程序创建两个优先队列:q1和q2。q1是一个最小堆,用于存储较小的元素;q2是一个最大堆,用于存储较大的元素。
程序进入一个循环,循环n次。在每次循环中,程序提示用户输入一个整数x。
根据x的大小,程序决定将x添加到哪个优先队列中:
如果q2为空,或者x大于等于q2的顶部元素(即q2中的最大元素),则将x添加到q2中。
否则,将x添加到q1中。
每次添加新元素后,程序检查两个优先队列的大小,以确保q1中的所有元素都小于q2中的所有元素。如果q2的大小超过q1的大小加1,程序将q2的顶部元素(最大元素)移动到q1中。如果q1的大小超过q2的大小加1,程序将q1的顶部元素(最小元素)移动到q2中。
在循环的奇数次迭代中,程序输出q1的顶部元素;在偶数次迭代中,输出q2的顶部元素。这样可以确保输出的序列是交替的,且每次输出的都是当前两个堆中较大的元素。
循环结束后,程序结束。
*/

int main() {
    int n;
    scanf("%d", &n);  // 读取输入的整数n

    priority_queue<int> q1;  // 创建一个优先队列q1,用于存储较小的元素
    priority_queue<int, vector<int>, greater<int> > q2;  // 创建一个优先队列q2,用于存储较大的元素

    for (int i = 1; i <= n; i++) {
        int x;
        scanf("%d", &x);  // 读取输入的整数x

        // 如果q2为空或者x大于等于q2的顶部元素,将x添加到q2中
        if (q2.empty() || x >= q2.top()) {
            q2.push(x);
            // 如果q2的大小大于q1的大小加1,将q2的顶部元素弹出并添加到q1中
            if (q2.size() > q1.size() + 1) {
                int t = q2.top();
                q2.pop();
                q1.push(t);
            }
        }
        else {
            // 否则,将x添加到q1中
            q1.push(x);
            // 如果q1的大小大于q2的大小加1,将q1的顶部元素弹出并添加到q2中
            if (q1.size() > q2.size() + 1) {
                int t = q1.top();
                q1.pop();
                q2.push(t);
            }
        }

        // 如果i是奇数,输出q1或q2的顶部元素(取决于哪个队列的大小更大)
        if (i % 2 == 1) {
            if (q1.size() > q2.size())
                printf("%d\n", q1.top());
            else
                printf("%d\n", q2.top());
        }
    }

    return 0;
}