1 条题解

  • 3
    @ 2026-8-14 19:39:10

    题面并不复杂,观察数据范围容易发现二分答案可以通过。

    实现也不复杂。

    令当前期望中位数为 midmid,显然序列中最多只能有 ⌊n2⌋\left\lfloor \dfrac{n}{2} \right\rfloor 个数 <mid<mid。对于多出来的 <mid<mid 的数将它们都改为 midmid,很显然这样做代价是最小的。

    如果代价 >k>k 说明中位数 =mid=mid 是无法实现的,反之可以实现。

    时间复杂度可能是O(n⋅log⁡n)O(n\cdot\log n),可以通过因为我过了。

    #include<bits/stdc++.h>
    using namespace std;
    #define int unsigned long long
    const int maxn=2e5+7;
    int a[maxn];
    int n,k;
    bool check(int mid){
        int cnt=0,sum=0;
        for(int i=1;i<=n;i++){
            if(a[i] >= mid)break;
            if(a[i] < mid)cnt++;
            if(cnt > n/2)sum+=mid-a[i];
        }
        return sum<=k;
    }
    signed main(){
        cin>>n>>k;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        int l=1,r=1e16,ans=0;
        sort(a+1,a+n+1);
        while(l<=r){
            int mid=l+(r-l)/2;
            if(check(mid)){
                ans=mid;
                l=mid+1;
            }
            else r=mid-1;
        }
        cout<<ans;
    }
    
    • 1

    信息

    ID
    7254
    时间
    2000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    19
    已通过
    5
    上传者