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; }