C. Maximum Median 二分

 C. Maximum Median

题意: 给定一个数组,可每次可以选择一个数加1,共执行k次,问执行k次操作之后这个数组的中位数最大是多少?

题解:首先对n个数进行排序,我们只对大于中位数a[n/2]的数进行操作,所以这个最大中位数的取值范围是确定的,在区间[  [a[n/2],a[n-1]  ]之内,二分枚举最大的中位数x;

通过判断使x成为最大中位数的操作数是否大于k来缩小范围

#include<iostream>
#include<string.h>
#include<string>
#include<algorithm>
#include<math.h>
#include<string>
#include<string.h>
#include<vector>
#include<utility>
#include<map>
#include<queue>
#include<set>
#define mx 0x3f3f3f3f
#define ll long long
using namespace std;
ll a[200005];
ll n,k;
int find(ll x)
{
    ll num=0;
    for(int i=n/2;i<n;i++)
    {
        if(a[i]<=x)//对所有比中位数小的答案进行增加操作,num记录操作次数
            num=num+x-a[i];
    }
    if(num<=k)
        return 1;
    else
        return 0;
}
int main()
{
    cin>>n>>k;
    for(int i=0;i<n;i++)
        cin>>a[i];
    sort(a,a+n);
    ll t=0;
    ll l=a[n/2],r=a[n-1]+k,mid,ans;
    while(l<=r)//二分枚举最大的中位数x,x在区间[l,r]中
    {
        mid=l+(r-l)/2;
        if(find(mid)==1)//mid偏小
        {
            l=mid+1;
            ans=mid;   
        }
        else
            r=mid-1;
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/-citywall123/p/11393617.html

相关文章