http://oi.hdoi.cn/training/8/problem/CF-1201C
I m a k f Imakf Imakf 给您一个长度为 n n n 的数组 a a a, ( n (n (n 为奇数 ) ) ) 您可以对数组进行如下操作
您有 k k k 次操作机会,请最大化数组的中位数
一组数据的中位数是指数组从小到大排序后位于最中间的数,例如 [ 1 , 5 , 2 , 3 , 5 ] [1,5,2,3,5] [1,5,2,3,5] 的中位数是 3 3 3.
第一行两个整数 $n\ (1 \leq n \leq 2 \times 10^5 ,n $ 奇数 ) , k ( 1 ≤ k ≤ 1 0 9 ) ),k\ (1 \leq k \leq 10^9) ),k (1≤k≤109) ,含义同题目描述
第二行 n n n 个整数表示数组 a ( 1 ≤ a i ≤ 1 0 9 ) a\ (1 \leq a_i \leq 10^9) a (1≤ai≤109)
一个整数,经过 k k k 次操作后数组最大中位数
样例 1 1 1 中,对 a 2 a_2 a2 进行两次操作,数组变为 [ 1 , 5 , 5 ] [1,5,5] [1,5,5]
样例 2 2 2 中,一种最佳操作是使数组变为 [ 1 , 3 , 3 , 1 , 3 ] [1,3,3,1,3] [1,3,3,1,3]
样例 3 3 3 中,一种最佳操作是使数组变为 [ 5 , 1 , 2 , 5 , 3 , 5 , 5 ] [5,1,2,5,3,5,5] [5,1,2,5,3,5,5]
You are given an array $ a $ of $ n $ integers, where $ n $ is odd. You can make the following operation with it:
You want to make the median of the array the largest possible using at most $ k $ operations.
The median of the odd-sized array is the middle element after the array is sorted in non-decreasing order. For example, the median of the array $ [1, 5, 2, 3, 5] $ is $ 3 $ .
The first line contains two integers $ n $ and $ k $ ( $ 1 \le n \le 2 \cdot 10^5 $ , $ n $ is odd, $ 1 \le k \le 10^9 $ ) — the number of elements in the array and the largest number of operations you can make.
The second line contains $ n $ integers $ a_1, a_2, \ldots, a_n $ ( $ 1 \le a_i \le 10^9 $ ).
Print a single integer — the maximum possible median after the operations.
3 2
1 3 5
5
5 5
1 2 1 1 1
3
7 7
4 1 2 4 3 4 4
5
In the first example, you can increase the second element twice. Than array will be $ [1, 5, 5] $ and it’s median is $ 5 $ .
In the second example, it is optimal to increase the second number and than increase third and fifth. This way the answer is $ 3 $ .
In the third example, you can make four operations: increase first, fourth, sixth, seventh element. This way the array will be $ [5, 1, 2, 5, 3, 5, 5] $ and the median will be $ 5 $ .
这道题我灵光一现,直接想出来了算法;
二分中位数大小,再将比他大的数依次比较记录最小达成此数要加的数量
与k比较
二分
#include
using namespace std;
#define ll long long
const int maxn=2e5+10;
const ll inf=4e9;
int n,k;
ll ans;
int a[maxn];
inline bool check(ll op){
ll cnt=0;
//比他大的数至少要达到op,记录cnt为比他大的数最少要达到op需要加的总数量
for(int i=n/2+1;i<=n;i++){
if(a[i]<op)cnt=cnt+op-a[i];
}
if(cnt<=k)return true;
else return false;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1,a+n+1);
ll l=a[n/2+1],r=inf;
//二分中间数
while(l<=r){
ll mid=(l+r)/2;
if(check(mid)){
ans=mid;
l=mid+1;
}
else r=mid-1;
}
printf("%d\n",ans);
return 0;
}