中位數

一個有 n 個整數的數組 a,n是一個奇數。

每次可以選擇數組裏的一個元素 a​i
​​ 並把這個元素加上 1。

在至多 k 次操作之後,數組的中位數最大能變成多少。

輸入格式:
多組輸入

第一行兩個整數 n,k(1≤n≤2×10^{5}
​​ ,1≤k≤10^{​9}
​​ )。

第二行 n 和整數 a1
​​ ,a​2
​​ ,…,a​n``​​ 。

輸出格式:
k 次操作後數組的中位數。

輸入樣例:
3 2
1 3 5
輸出樣例:
5

#include <bits/stdc++.h>

#define int long long
using namespace std;
const int maxn = 2e5 + 10;
const int N = 1e11;
int a[maxn], n, k;

int check(int mid) {
    int s = 0;
    for (int i =(n+1)/ 2; i < n; i++) {
        if (a[i] < mid) {
            s += mid - a[i];
            if (s > k) return false;
        }
    }
    return true;
}

signed main() {
    while (cin >> n >> k) {
        for (int i =1; i < n; i++) {
            cin >> a[i];
        }
        sort(a, a + n);
        int l = 0, r = N, ans;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (check(mid)) {
                ans = mid;
                l = mid + 1;
            } else r = mid - 1;
        }
        cout << ans << endl;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章