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---二分第k大(二分套二分)
Codeforces 1360H - Binary Median (二分)