考虑从1
到的整数值的置换N
。例如此示例N = 4
:
[1, 3, 4, 2]
我们将认为此列表是循环的,因此1
和2
被视为相邻列表。我们可以为这样的列表计算的一个量是相邻值的总平方差:
(1-3)² + (3-4)² + (4-2)² + (2-1)² = 10
给定正整数,您的任务是找到一个最大化此数量的排列N
。在N = 4
上面的例子中不是最佳的(实际上,这是最小的)。18
通过以下排列(以及其他几个排列),我们可以实现的总平方差:
[1, 4, 2, 3]
您的算法必须在(的N
)多项式时间内运行。特别是,您不能简单地计算所有排列的总平方差。
您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行自变量或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。
输出可以采用任何方便,明确,平坦的列表或字符串格式。您可以选择从与返回值的列表0
,以N-1
代替1
向N
。
适用标准代码高尔夫球规则。
测试数据
这个问题有一个很好的分析解决方案。例如,所有有效的解决方案N = 10
均等效于以下列表(直至循环移位和反转):
[7, 5, 6, 4, 8, 2, 10, 1, 9, 3]
我不想透露过多的信息(尽管足以找出模式),因此无需给出更多示例,您可以检查您的结果是否具有给定的总平方差N
:
N Total squared difference
1 0
2 2
3 6
4 18
5 36
6 66
7 106
8 162
9 232
10 322
33 11936
100 333202
333 12308236
1000 333332002
这是OEIS条目A064842(如果您遇到困难,它也包含对本文的引用以及解决此难题的方法)。
(i<n/2||n%2)^i%2?i+1:n-i
。