【CF1201C】Maximum Median

题意:

给定一个长度为 $n$ 的序列,并得到了 $k$ 次操作的机会,每一次操作就是把其中一个数的值加 $1$。

求合理安排这 $k$ 次操作,使得结果序列的中位数最大。

$1 \le n \le 2*10^5,1 \le k \le 10^9$

分析:

我们可以用贪心策略想,如果给原始序列小于中位数的数进行操作,那么答案肯定不是最优的,不如给较大的数字。

所以,我们可以删去这个序列中所有小于中位数的数。

删去之后,那原来的中位数就变成了这个序列中最小的数了。

问题便转换成 “最小值最大” 这一类问题了,没错,可以二分答案。

我们肯定要尽可能地给最小的数进行操作,但是这个数一旦超越了其它数就不再是最小的数了。

所以,我们要分析一下,以下图为例:

我们要让 $1$ 号点尽量大,那么就要多分给一号点操作次数,但同时要保证 $1$ 号均不大于其它的数。

所以,我们将高度(即答案)进行二分:

如果要让 $1$ 号点填充到两层,那么要这么做:

这样需要进行 $1$ 次操作;

如果要让 $1$ 号点填充到三层,要这样:

一共需要 $1+3=4$ 次操作。

所以,检验条件就是看看所有小于待定高度的点高度差加起来是否会超过 $k.$

这样,就可以写代码了:

#include <algorithm>
#include <cstdio>
typedef long long ll;

ll n, k, a[200010], ans, l, r;

bool check(ll x){
    ll sum = 0;
    for(ll i=1; i<=n; i++)
        if(a[i] < x)
            sum += x - a[i];    //算高度差之和
        else
            break;
    return sum <= k;         //检验条件
}

int main(){

    scanf("%lld%lld", &n, &k);
    for(ll i=1; i<=n; i++)
        scanf("%lld", &a[i]);
    std::sort(a + 1, a + n + 1);  //注意二分的单调性,因此要排序

    n = n / 2 + 1;           //为方便,这里提前改变 n 的规模
    for(ll i=1; i<=n; i++)
        a[i] = a[n + i - 1];

    l = 1, r = 2e9;
    while(l < r){
        ll mid = (l + r + 1) >> 1;
        if(check(mid)) l = mid;
        else r = mid - 1;
    }

    printf("%lld\n", l);

    return 0;
}

复杂度 $\text{O(n log n)}.$



另外,这题还有别的做法,如贪心(复杂度线性)等,此处不说明了,有兴趣的可以去研究一下。

原文地址:https://www.cnblogs.com/zengpeichen/p/11515613.html

时间: 2024-10-08 20:45:32

【CF1201C】Maximum Median的相关文章

【LeetCode】 Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4], the contiguous subarray [4,−1,2,1] has the largest sum = 6. More practice: If you have figu

【LeetCode】 Maximum Depth of Binary Tree

Maximum Depth of Binary Tree  Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 递归基础,不解释. class Solution { public: int getMax(TreeNode *root

【CF888E】Maximum Subsequence 折半搜索

[CF888E]Maximum Subsequence 题意:给你一个序列{ai},让你从中选出一个子序列,使得序列和%m最大. n<=35,m<=10^9 题解:不小心瞟了一眼tag就一下子知道怎么做了,吓得我赶紧把tag屏蔽了. 我们将原序列拆成两半,每一部分都暴力搜索出所有的子序列之和,用set存起来.然后枚举前一半的所有子序列和,设其为x,则使得总和%m最大的右半部分子序列和一定是所有<m-x的数中最大的那个,在set里找一下前驱就行了. #include <cstdio&

【LeetCode】【Solution】Maximum Product Subarray

[题目] Find the contiguous subarray within an array (containing at least one number) which has the largest product. For example, given the array [2,3,-2,4], the contiguous subarray [2,3] has the largest product = 6. [解法] 参考 http://segmentfault.com/blog

【poj3693】Maximum repetition substring(后缀数组+RMQ)

自己看着大牛的论文学了一下后缀数组,看了好久好久,想了好久好久才懂了一点点皮毛TAT 然后就去刷传说中的后缀数组神题,poj3693是进化版的,需要那个相同情况下字典序最小,搞这个搞了超久的说. 先简单说一下后缀数组.首先有几个重要的数组: ·SA数组(后缀数组):保存所有后缀排序后从小到大的序列.[即SA[i]=j表示排名第i的后缀编号为j]        ·rank数组(名次数组):记录后缀的名次.[即rank[i]=j表示编号为i的后缀排名第j] 用倍增算法可以在O(nlogn)时间内得出

【数组】Maximum Subarray

题目: Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1] has the largest sum = 6. click to show more practice.

【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大

Add Date 2014-09-23 Maximum Product Subarray Find the contiguous subarray within an array (containing at least one number) which has the largest product. For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the largest product = 

【leetcode】Maximum Depth of Binary Tree

Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 利用递归. 也可以使用栈和队列,即使用DFS和BFS方法. C++: 1 /** 2 * Definition for binary tree 3 * struct TreeNod

【Leetcode】4. Median of Two Sorted Arrays

题目描述: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). 解题思路: 这道题个人觉得是很难的,要想解出这个题,就必须了解一下几点: 1.求一列长度为len的数字的中位数,其实也可以被看做是求第len/2