一个有 n 个整数的数组 a,n是一个奇数。
每次可以选择数组里的一个元素 ai 并把这个元素加上 1。
在至多 k 次操作之后,数组的中位数最大能变成多少。
输入格式:
多组输入
第一行两个整数 n,k(1≤n≤2×105,1≤k≤109)。
第二行 n 和整数 a1,a2,......,an。
输出格式:
k 次操作后数组的中位数。
输入样例:
3 2
1 3 5
输出样例:
5
千万千万要注意:
多组输入!!!!!!
超大数据!!!!!!10^9
long long int
思路:
先排序后确定中位数
如果想要中位数最大,则中位数<=后面任意一个数
所以每次使中位数a[h]尽量接近a[h+flag]
如果剩余的k大于差值,则要使中位数到a[h+flag]之间的数都加上差值
否则,使k/flag,使中间的数均加上k/flag;
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
long long m;
int main(){
while(cin>>n>>m){
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
long long int h=(n-1)/2;
long long int flag=1;
while(m!=0){
if(h+flag>n-1){
a[h]+=m/flag;
m=0;
break;
}
long long int t=a[h+flag]-a[h];
if(m>=t*flag){
m-=t*flag;
a[h]+=t;
}
else{
a[h]+=m/flag;
m=0;
}
flag++;
}
cout<<a[h]<<endl;
}
}