【问题标题】:Minimum sum of products of elements from two arrays两个数组元素乘积的最小和
【发布时间】:2020-08-11 17:21:57
【问题描述】:

我练习了一段时间的竞技编程,一个随机的问题突然出现在我的脑海中。我在在线网站上找不到解决方案,因此将其发布在这里。

给定两个数组AB,它们包含整数且大小相同n。我需要创建一个从A 的元素到B 的元素的一对一映射。假设配对元素是{(p1A,p1B),(p2A,p2B),.....,(pnA,pnB)}。我需要找到最小化p1A*p1B + p2A*p2B + .... + pnA*pnB 的映射。

我们如何解决这个问题?如果您能提供正确答案的证明,那将非常有帮助。

【问题讨论】:

  • 我假设 (a) 元素不必按顺序配对,并且 (b) 每个元素必须只配对一次?换句话说,找到A 的排列/改组A' 使得sum(A'[i]*B[i] for all i) 最小?
  • 没有尝试过,当然也没有证据,但我的直觉是将 A 中最大的与 B 中的最小配对,依此类推。
  • 元素总是积极的/非消极的吗?
  • @tobias_k 是的,您需要找到 A 的排列/改组 A' 使得 sum(A'[i]*B[i] for all i) 最小?
  • @amit 这不是任何网站上的标准问题,所以我试图找到一个没有限制的解决方案,即。数字是整数(正数或负数)。但我想知道如果给出的数字是正数,是否存在简单的解决方案。

标签: arrays algorithm


【解决方案1】:

看起来@tobias_k 的 cmets 解决方案可行。

证明: 不失一般性,A 被排序(A[i] <= A[i+1]),我们只能置换B。 如果存在i 这样B[i] < B[i+1] 则通过交换这些元素,总和会改变

new_sum - old_sum = A[i]*B[i+1] + A[i+1]*B[i] - A[i]*B[i] - A[i+1]*B[i+1] 
                  = A[i](B[i+1] - B[i]) - A[i+1](B[i+1] - B[i]) 
                  = (A[i] - A[i+1])(B[i+1] - B[i])
                  <= 0

然后对于B 的任何起始排列,我们可以对B 进行冒泡排序,使其按降序排序,而总和不会增加。 QED。

所以,算法就是简单地将A升序排序,B降序排序得到映射。

【讨论】:

  • 对我来说似乎是正确的。为了更容易理解,您可以添加第二行 = A[i](B[i+1] - B[i]) + A[i+1](B[i] - B[i+1] 和倒数第二行 = [neg] * [pos]
猜你喜欢
  • 2017-03-01
  • 2017-02-02
  • 1970-01-01
  • 2021-05-09
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
相关资源
最近更新 更多