以下是我在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
答案 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)
对数组进行排序,按升序调用sortedArray
。
移除max1
,max2
并将其放入result
列表。
删除下一个元素并将其添加到MAX(max1, max2)
一侧。
更新max1
和max2
。即max1
左侧,max2
位于列表的右侧。
重复步骤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]