最小化数组中的最大元素

时间:2012-10-27 15:06:58

标签: algorithm dynamic-programming greedy divide-and-conquer

您有一个大小为n的正整数数组,您最多可以在N次执行以下操作:

  • 选择子数组并按k减少其元素值(k必须小于子数组的最小值)。
  • 这样的操作花费了子阵列的大小乘以k
  • 这些操作的总费用不得超过M
  • N,M可能非常大。

你能给我一个有效的算法来最小化这个数组中的最大元素吗?

3 个答案:

答案 0 :(得分:1)

如果我们可以创建一个可以检查是否可以达到给定最大值的函数,那么我们可以使用最大上的二进制搜索找到解决方案。 (每次达到最大值时,减少它,如果无法达到,则增加它。)

检查功能可能如下所示:

def check(array, M, i, j, max)

如果可以将i和j之间的所有内容减少到M以下,则返回true。我们从i=0, j=len(array), max=max_guess

开始

你现在有很多选择,可以在里面检查。你可以试试:

possible = check(M/2, i..i+j/2, ..) and check(M/2, i..i+j/2,..)
return possible
然而,将M分成两半并不是一个好主意,因为一半可能需要更多。也许您可以使用二进制搜索来确定如何将M分成两半。然而,也许甚至不可能将阵列分成两半,因为一些子部分可能会超过两半,所以也许你需要将其拆分到哪里?或者你可能需要尝试i,j的所有组合进行分裂。

祝你好运。

答案 1 :(得分:0)

假设我们选择x作为缩减数组中的最大数字,我们可以取数组并将所有较大的元素减少到x并计算这些操作的成本及其数量然后我们可以尝试贪婪地加入最便宜的(成本)这些元素的子集直到操作数小于N.如果成本大于M,那么最小元素必须在缩小的数组中更大。对于x,我们可以很容易地二进制搜索它。

答案 2 :(得分:0)

老实说,我怀疑找到解决这个问题的最佳方法是NP难。我承认这不是特别有用,但它可能会让你对如何处理这个问题的更大问题有不同的看法。