• CF1201C最大中位数题解


    题目

    链接

    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 为奇数 ) ) ) 您可以对数组进行如下操作

    • 选择数组中的一个元素,使其增加 1 1 1

    您有 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 (1k109) ,含义同题目描述

    第二行 n n n 个整数表示数组 a   ( 1 ≤ a i ≤ 1 0 9 ) a\ (1 \leq a_i \leq 10^9) a (1ai109)

    输出格式

    一个整数,经过 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:

    • Choose one of the elements of the array (for example $ a_i $ ) and increase it by $ 1 $ (that is, replace it with $ a_i + 1 $ ).

    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.

    样例 #1

    样例输入 #1
    3 2
    1 3 5
    
    样例输出 #1
    5
    

    样例 #2

    样例输入 #2
    5 5
    1 2 1 1 1
    
    样例输出 #2
    3
    

    样例 #3

    样例输入 #3
    7 7
    4 1 2 4 3 4 4
    
    样例输出 #3
    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;
    } 
    
  • 相关阅读:
    【网络安全的神秘世界】docker介绍及安装教程
    用HttpURLConnection来实现retrofit类似功能(由于retrofit不支持5.0以下)
    Git Pro精要(一) 基本概念
    SQL Server 数据库之导入导出数据
    【必备】用VSCode开发Vue程序必备插件之一Vue Language Features (Volar)
    3D Instances as 1D Kernels
    [2020 新春红包题]3(libc2.29 tcache tashing unlink )
    认识HTTP请求
    JavaWeb — Servlet — 剩余内容+JSP
    隐私计算基础组件系列-混淆电路
  • 原文地址:https://blog.csdn.net/weixin_42178241/article/details/127095947