给定一个由 n 个整数组成的数组 a,其中 n为奇数。
你可以对其进行以下操作:
- 选择数组中的一个元素(例如 ai),将其增加 1(即,将其替换为 ai+1)。
你最多可以进行 k次操作,并希望该数组的中位数能够尽可能大。
奇数长度的数组的中位数是数组以非降序排序后的中间元素。
例如,数组 [1,5,2,3,5] 的中位数为 3。
解题思路:
二分查找,排序之后将右边所有比 x 大的数变成x,实际是计算这样做的代价,如果最后的代价
v < k , 说明此时的 x 还可以增大,故 l = mid+1 , 否则 r = mid ;
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
typedef long long ll;
ll a[N],k;
int n;
bool check(ll x)
{
ll v=0;
for(int i=n>>1;i<n;i++)
{
if(a[i]<x) v += x-a[i];
else break;
}
return v <= k;
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
ll l=0, r=2e9+10, mid;
while(l<r)
{
mid = l+r>>1;
if(check(mid)) l=mid+1;
else r=mid;
}
cout<<l-1<<endl;
return 0;
}