C. Maximum Median 二分

Posted -citywall123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

 

以上是关于C. Maximum Median 二分的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3579 Median 二分+思维

POJ-3579 Median---二分第k大(二分套二分)

POJ3579 Median —— 二分

Codeforces 1360H - Binary Median (二分)

Codeforces 1360H - Binary Median (二分)

Leetcode 4 Median of Two Sorted Arrays 二分查找(二分答案)