【问题标题】:Maximum Median competitive programming question最大中位数竞争编程问题
【发布时间】:2021-09-15 11:22:02
【问题描述】:

给你一个由 N 个整数组成的数组。现在您可以对其执行一种操作,即选择任何索引 i 并将 ai 增加 1,即 ai=ai+1。通过此操作,您希望最大化中位数。此外,您最多可以应用此操作 K 次。奇数数组的中位数是数组非降序排序后的中间元素。

输入: 3 2

1 3 5

输出: 5

输入: 5 5

1 2 1 1 1

输出: 3

我很难理解这个问题,我的想法是,他们要求最大中位数,如果我们只是排序并选择中间元素并用 k 增加它。那么它将是最大中位数。我在互联网上看到了一些解决方案,但我无法理解。有人可以帮我在这里做什么吗?

【问题讨论】:

  • 从概念上讲,这很容易:要最大化中值,增加中值元素。但是,递增后的元素可能不再是中位数,因此在这样一个简单的实现中,您需要在中位数元素每次递增后对数组进行重新排序。
  • 您能解释一下您发布的输入/输出值的含义吗?

标签: c++ search max binary-search median


【解决方案1】:

我的想法是,他们要求最大中位数,如果我们只是排序并选择中间元素并用 k 增加它。那么它将是最大中位数。

并非如此,因为一旦增加,该元素很可能不再是中位数。考虑示例1, 2, 1, 1, 1。中位数是1(排序:1, 1, 1, 1, 2),如果将所有k = 5 添加到该元素,您将获得1, 1, 6, 1, 2 -> 1, 1, 1, 2, 6。中位数仍然是1,这是“错误的”。

请尝试以下算法。

  • 对 N 个整数进行排序。 Once,在开头,这样你就可以很容易地找到中位数(如果是N偶数,就是中间的元素或者两个连续的中间元素的平均值)。现在你可以忘记所有小于中位数的元素(同样,如果 N 是偶数,你需要保留其中一个)。

  • 找到大于中位数的第一个元素。在前面的示例中,我们将有 1, 1, 2,因此有 2 个元素(我们称之为 m)等于中位数,2 是第一个大于中位数的元素。

    为了能够增加至少一个的中位数,我们应该从k 中至少消耗m(通过从k 中减去m),理想情况下,将等于中位数的每个元素加 1(包括该元素)-> 2, 2, 2(是的,整个数组将是 1, 1, 2, 2, 2,但同样,忽略较小的值),所以现在的中位数是 2。

    现在有 3 个元素,全部相等,要使中位数增加 1,我们必须消耗 k 中的 3 个。只要k保持积极态度,我们就可以继续。

  • 如果k 不足以“填补”空白(当k < m 时),我们需要停止,并且中位数不能再增加。例如。在前面的例子中,步骤是:k = 5, 1, 1, 2, m = 2 -> k = 3, 2, 2, 2, m = 3 -> k = 0, 3, 3, 3 -> 最大中位数 = 3 ;

【讨论】:

    【解决方案2】:

    这段代码看起来如何?这将重复排序并增加中位数 k 次。我添加了一些 cmets,希望对您有所帮助:

    void increase_median(std::vector<int>& values) {
        // make sure things are sorted so we can get the median easily
        std::sort(values.begin(), values.end());
    
        // the median is the middle element, increment it
        size_t mid_point = values.size() / 2;
        values[mid_point]++;
    }
    
    std::vector<int> increment_median_k_times(std::vector<int> values, size_t k) {
        // increment k times
        for (size_t i = 0; i < k; ++i) {
            increase_median(values);
        }
        // one last sort for good measure
        std::sort(values.begin(), values.end());
        return values;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2023-01-30
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 2021-01-05
      • 2013-12-31
      相关资源
      最近更新 更多