我从事竞争性编程一段时间了,脑海中浮现出一个随机的问题。我在在线网站上找不到解决方案,因此将其发布在这里。
给出两个数组A
和B
,它们包含整数并且大小相同n
。我需要创建一个一对一的映射,并将其从A
的元素映射到B
的元素。假设配对的元素为{(p1A,p1B),(p2A,p2B),.....,(pnA,pnB)}
。我需要找到最小化p1A*p1B + p2A*p2B + .... + pnA*pnB
的映射。
我们如何解决这个问题?如果您可以在回答中提供正确性证明,那将非常有帮助。
答案 0 :(得分:1)
在评论中看起来像@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
降序排序以获得映射。