洛谷 P1168 中位数

题目链接:中位数



思路

       由于需要查询的是输入奇数个数字时的中位数,所以可以将输入的第一个数字初始化为默认的mid,然后再输入数据时将小于mid的元素加入大根堆,大于等于mid的元素加入小根堆,当输入到奇数个元素时,就可以判断当前大小根堆中的元素个数是否相等,相等则可以输出当前的mid,否则将mid加入较少元素的堆,将较多元素的堆取出元素,赋值给mid,重复操作知道两个堆元素个数相等,即可输出mid。


代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5 + 10;

ll account[N];

// 大顶堆,默认也是大顶堆
priority_queue<ll, vector<ll>, less<ll>> les;
// 小顶堆
priority_queue<ll, vector<ll>, greater<ll>>gre;
int main() {
  ll n, m, mid;
  cin >> n;

  cin >> account[1];
  mid = account[1];
  cout << mid << endl;

  for (int i = 2; i <= n; i++) {
    cin >> account[i];
    if (account[i] < mid) {
      les.push(account[i]);
    } else {
      gre.push(account[i]);
    }

    if (i % 2) {
      while (les.size() > gre.size())
        gre.push(mid), mid = les.top(), les.pop();
      while (les.size() < gre.size())
        les.push(mid), mid = gre.top(), gre.pop();
      if (les.size() == gre.size())
        cout << mid << endl;
    }
  }

  return 0;
}
posted @ 2024-06-20 15:32  薛定谔的AC  阅读(42)  评论(0)    收藏  举报