最大化相邻数字的乘积之和

时间:2012-06-17 01:31:06

标签: algorithm mathematical-optimization

以下是我在Interviewstreet codesprint期间遇到的问题。 我无法找到解决方案,甚至没有想到它的方向。如果有人能帮助我找到灵魂,或者解释我需要如何解决这个问题,我会感激不尽。

  

给定数字1,2,3,...,N,按顺序排列它们   产品数量乘积之和最大化。

     

例如:如果N = 3,我们将它们命名为(1,2,3),总和   产品是1 * 2 + 2 * 3 = 8,如果我们将它们命名为(1,3,2)总和   产品是1 * 3 + 3 * 2 = 9.

     

输入格式:

     

输入的第一行包含T,即测试用例的数量。然后   跟随T行,每行包含一个整数N。

     

输出格式:

     

对于每个测试用例打印相邻产品的最大总和   号。

     

示例输入:

     

2 2 4

     

示例输出:

     

2 23

     

说明:

     

在给出排列的第一个测试案例中,(1,2)。所以最大总和   产品是1 * 2。在第二个测试案例中,数字是(1,2,3,4)。   安排1,3,4,2具有相邻数字的乘积之和   1 * 3 + 3 * 4 + 4 * 2 = 23.没有其他安排有相邻产品的总和   数字超过23。

     

约束:

     

1< = T< = 10 1< = N< = 200000

2 个答案:

答案 0 :(得分:6)

当最大值位于序列的中间时,最大相邻和的乘积出现,并且连续的较低值交替出现在其左侧和右侧。也就是说,给定值n的序列将是[...,n-3,n-1,n,n-2,n-4,...](或者相反,它将具有相同数量的产品)。

所以,省略输入解析位,这是算法的核心(在Python中,但很容易翻译成其他语言):

def maximumSumOfAdjacentProducts(n):
    if n == 1: # special case needed for a one element sequence
        return 1

    sumOfProducts = n * (n-1) # this pair is the "center" of the sequence

    for i in range(n-2, 0, -1): # iterate downward from n-2 to 1
        sumOfProducts += i*(i+2) # each adjacent pair is separated by 2

    return sumOfProducts

答案 1 :(得分:1)

  1. 对数组进行排序,按升序调用sortedArray

  2. 移除max1max2并将其放入result列表。

  3. 删除下一个元素并将其添加到MAX(max1, max2)一侧。

  4. 更新max1max2。即max1左侧,max2位于列表的右侧。

  5. 重复步骤3& 4直到排序的输入数组有元素。

  6. 示例:

    inputArray: 1,3,4,2,5
    
    sortedArray: 1,2,3,4,5
    
    Add 5 and 4 to the list first.
    
    result = [5, 4]
    
    Remove 3 and add it to MAX(5,4)
    
    result = [3, 5, 4]
    
    Remove 2 and add it to MAX(3,4)
    
    result = [3, 5, 4, 2]
    
    Remove 1 and add it to MAX(3,2)
    
    result = [1, 3, 5, 4, 2]