当前位置: 首页 > 知识库问答 >
问题:

乘积最大和

汪高岑
2023-03-14

给定N个数字,范围为-100.100。

要求重新排列元素以使产品价值之和最大。此任务中的乘积和定义为a1*a2+a2*a3..an-1*an

例如,给定数字10 20 50 40 30。

1,-2,3,-4,5,-6,7,-8,9,10,11,12,13,14,15,-16

预期的最大乘积为1342。

我的算法给出了下一个重排:

共有1个答案

陈增
2023-03-14

你的方法是合理的,但你必须把正数和负数分开。

对数组进行排序并将其分成左右两部分,一个部分包含所有负数,另一个部分包含所有非负数。像以前一样重新排列它们,最大的(绝对)值在中间,递减的值交替放在两边,但要确保每个部分的最小值在相反的两端。

具体来说,绝对值最小的负数应该是左部分的最后一个元素,值最小的非负值应该是右部分的第一个元素。

arr = [2, 3, 5, -6, -2, -5]
arr.sort() = [-6, -5, -2, 2, 3, 5]
left, right = [-5, -6, -2], [2, 5, 3]
max_sum_of_product = -5*-6 + -6*-2 + -2*2 + 2*5 + 5*3 = 63
def max_sum_of_products(arr):
  from itertools import permutations
  n = len(arr)

  ###### brute force method
  max1 = max([sum([a[x-1]*a[x] for x in range(1,n)]) for a in permutations(arr)])

  ###### split method
  lo, hi = [x for x in arr if x<0], [x for x in arr if x>=0]
  lo.sort()
  hi.sort()
  lo_ordered, hi_ordered = [], []
  t = (len(lo)%2 == 1)
  for x in lo:
    if t:
      lo_ordered = lo_ordered + [x]
    else:
      lo_ordered = [x] + lo_ordered
    t = not t
  t = (len(hi)%2 == 0)
  for x in hi[::-1]:
    if t:
      hi_ordered = hi_ordered + [x]
    else:
      hi_ordered = [x] + hi_ordered
    t = not t
  arr = lo_ordered + hi_ordered
  max2 = sum([arr[x-1]*arr[x] for x in range(1,n)])

  return (max1, max2)

def test():
  from random import randint
  for i in range(10):
    a = []
    for j in range(randint(4,9)):
      a = a + [randint(-10,10)]
    print a,
    (max1,max2) = max_sum_of_products(a)
    if max2!=max1:
      print "bad result :-("
    else:
      print max1

test()
 类似资料:
  • 应用Kadane算法得到最大乘积子数组是一个棘手的问题。虽然我能够得到最大乘积,但我并没有真正得到最大乘积子数组的正确范围。 有人能帮我了解一下射程问题吗?这是一个标准的面试问题,我想确保我理解了乘积情况的逻辑,而不仅仅是说可以修改最大和子数组来回答最大乘积子数组的情况。 谢谢!!

  • 本文向大家介绍C ++中给定乘积的N个整数的最大GCD,包括了C ++中给定乘积的N个整数的最大GCD的使用技巧和注意事项,需要的朋友参考一下 假设我们有两个整数N和P。P是N个未知整数的乘积。我们必须找到这些整数的最大可能GCD。假设N = 3,且P = 24,则不同的组将像{1,1,24},{1,2,12},{1,3,8},{1,4,6},{2 ,2,6},{2,3,4}。GCD为:1、1、1

  • 给定一个数N,我们如何求最大P*Q null 因此,暴力解决方案起作用。 再进一步,我们看到Q_max<=n/2,如果我们确实同意P =√n。 我们可以将我们的解决方案集细化为仅有那些值{P,n\2},其中n\2>=√N。 这可能看起来微不足道,但它只是消除了可能的解决方案集的1/3。 我们是否可以添加其他聪明的程序来进一步减少设置?

  • 问题内容: 所以, 问题 我对行乘法有问题。在SQL中,有一个函数可以计算一组行中某个字段的总和。我想得到乘法,即表 这将是作为一个结果。我正在使用 DOUBLE 数据类型来存储我的数据值。 我的方法 从学校数学知道,-可以用来创建所需的表达式,例如: -在这里您会看到此方法的弱点-由于何时未定义-我需要在计算整个表达式之前计算负号。该小提琴提供了示例数据和对此的查询。另一个缺点是,我们需要确定列

  • 我有两个矩阵,如下所示: 我想找到一个向量,它是一个矩阵1*3,它的每一个元素都是M的每一行的最小元素乘以N的对应行的最大元素(例如,向量的第一个元素是矩阵M的第一行的最小元素,即1,乘以矩阵N的第一行的最大元素,即4,因此向量的第一个元素是1*4,即4)。最后的答案是:(1*4,1*3,1*4)=(4,3,4) 为了找到这个向量(或矩阵),我写了下面的代码: 但它太长了。有人能写一个更短(或更简