假设给定两组A和B,每个组包含n个正整数。您可以选择重新排列每个集合的顺序。重新排序后,让ai是集合A的第i个元素,让bi是集合B的第i个元素。然后,您将收到(a1 ^ b1)×(a2 ^ b2)×...×( an ^ bn)。给出一个将收益最大化的多项式算法。
答案: 我认为,如果我们对这两个集合进行越来越多的排序,问题将会解决。它需要o(nlog(n))时间。 有人反对吗?
答案 0 :(得分:0)
作为提示,我们可以将问题简化为另一个简单版本。如果您通过公式log
,我们将有:
b1 log(a1) + ... + bn log(an)
现在假设我们有两个向量V1 = <b1, b2, ..., bn>
和V2 = <a1, a2, ..., an>
。因此,公式是这两个向量(V1.V2
)的点积。通过点积的定义,我们知道V1.V2 = |V1|*|V2|* cos(theta)
。通过置换V1
和V2
的元素,我们知道V1
和V2
的范式不会改变。因此,我们需要最大化cos(theta)
(theta
是V1
和V2
之间的度数)。因此,我们需要最小化theta
(以最大化cos(theta)
)。
答案 1 :(得分:0)
很容易证明贪心算法-即将最大数与最大指数配对,然后将第二大数与第二大指数配对,以此类推-是最优的。
假设产品包括两个术语a[i] ** b[i]
和a[j] ** b[j]
,其中a[i] < a[j]
和b[i] > b[j]
。由此得出(a[i] ** b[j]) * (a[j] ** b[i])
大于(a[i] ** b[i]) * (a[j] ** b[j])
的原因是它们相差(a[j] / a[i]) ** (b[i] - b[j])
的因数,b[i]
假设是一个大于1的数与大于0的幂的乘方,因此系数大于1。因此,我们可以通过将b[j]
与{{1}}交换来改善收益,因此原始收益并不是最优的,因为可以通过进行交换来改善收益。
从这个意义上说,您的贪婪算法确实是正确的,因为它确实可以最大程度地提高回报。