【问题标题】:Maximize the sum of product of adjacent numbers最大化相邻数字的乘积之和
【发布时间】:2012-06-17 01:31:06
【问题描述】:

这是我在Interviewstreetcodesprint 期间遇到的一个问题。 我无法找到解决方案,甚至无法思考其方向。如果有人能帮助我找到灵魂,或者解释我需要如何处理这个问题,我将不胜感激。

给定数字 1, 2, 3, .., N,按顺序排列它们,使得 相邻数的乘积之和最大化。

例如:如果 N = 3,我们将它们排序为 (1, 2, 3),则 products 是 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

【问题讨论】:

    标签: algorithm mathematical-optimization


    【解决方案1】:

    当最大值位于序列的中间时,相邻乘积的最大和出现,并且连续较低的值在其左右交替。也就是说,给定值 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
    

    【讨论】:

    • 假设这是真的(似乎是这样,奇数 n 的答案等于 k*(8k^2+18k+1)/3,其中 n = 2k+1。A甚至 n 也有类似的公式。
    • 对于偶数 n,它是 (2k-1)(4k^2+5k-3)/3,其中 n=2k。
    • 是的,我也只是盯着解决这个问题。我认为您可以通过归纳证明这种序列是最好的。以长度为 2 的平凡序列作为基本情况,您总是希望在最大的一对值之间添加一个新的最大元素,通过归纳,它将始终位于中心。长度为 N 的新序列将比长度为 N-1 的前一个序列大N*(N-1) + N*(N-2) - (N-1)*(N-2),简化为N^2-3
    • 这通常有效吗?假设我们有 n 个大于 0 的实数。我认为需要证明如果 x>a>b>c>d,则 (a+b)x-ab > (c+d)x-cd
    • 哦,是的。不难证明。
    【解决方案2】:
    1. 对数组进行排序,按升序命名为sortedArray

    2. 删除max1max2并将它们放入result列表中。

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

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

    5. 重复步骤 3 和 4,直到排序后的输入数组包含元素。

    示例:

    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]
    

    【讨论】:

    • 不需要对数组进行排序,因为它总是 (1, 2, ..., N)。
    • @ffa0 我认为初始数组未排序。如果总是 (1,2,..., N) 则可以排除第 1 步。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多