两个数组中元素的乘积的最小和

问题描述

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

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

我们如何解决这个问题?如果您可以在回答中提供正确性证明,那将非常有帮助。

解决方法

在评论中看起来像@tobias_k的解决方案将起作用。

证明: 不失一般性,对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降序排序以获得映射。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...