CF1201C Maximum Median


思路:二分 ;

因为是要增大中位数,所以,我们发现,想要让中位数变大,就只能让中位数变成和后面的数一样大,而且想让它最大,于是就想到让该中位数在加完k后和后面的x个数相同
当然如果可以让中位数和最后一个数相同时最好不过的

代码来了

#include <bits/stdc++.h>
#define maxn 200010
#define int long long 
using namespace std ;
int n , m , a[maxn] ;
int check(int mid) {
	int cnt = 0 ;
	for(int i = n/2+1 ; i <= n ; i ++) {
		if(a[i] > mid) return 1 ;
		if(mid-a[i] > m-cnt) return 0 ;
		cnt += mid - a[i] ; 
	}
	return 1 ;
} 
signed main () {
	cin >> n >> m ;
	for(int i = 1 ; i <= n ; i ++) {
		cin >> a[i] ;
	}
	sort(a+1,a+1+n) ;
	int l = 1 , r = 2100000010 ;
	while(l < r) {
		int mid = (l+r) >> 1 ;
		if(check(mid)) {
			l = mid + 1 ;
		}else {
			r = mid  ;
		}
	}
	cout << r -1<< endl ;
	return 0 ;
}
posted @ 2019-08-15 20:26  _L_Y_T  阅读(210)  评论(1编辑  收藏  举报