Betrachten Sie eine Permutation der ganzzahligen Werte von 1
bis N
. ZB dieses Beispiel für N = 4
:
[1, 3, 4, 2]
Wir werden diese Liste prüfen sein zyklisch, so dass 1
und 2
wie benachbarte behandelt. Eine Größe, die wir für eine solche Liste berechnen können, ist die quadratische Gesamtdifferenz benachbarter Werte:
(1-3)² + (3-4)² + (4-2)² + (2-1)² = 10
Ihre Aufgabe ist es, eine Permutation zu finden, die diese Größe bei einer positiven ganzen Zahl maximiert N
. Im Falle des N = 4
obigen Beispiels ist es nicht optimal (in der Tat ist es minimal). Wir können eine quadratische Gesamtdifferenz von 18
mit der folgenden Permutation (wie auch mit mehreren anderen) erzielen :
[1, 4, 2, 3]
Ihr Algorithmus muss in Polynomialzeit (von N
) ausgeführt werden. Insbesondere können Sie nicht einfach die quadratische Gesamtdifferenz aller Permutationen berechnen.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Die Ausgabe kann in einem beliebigen praktischen, eindeutigen, einfachen Listen- oder Zeichenfolgenformat erfolgen. Sie können eine Liste mit Werten von 0
bis N-1
anstelle von 1
bis zurückgeben N
.
Es gelten die Standardregeln für Code-Golf .
Testdaten
Für dieses Problem gibt es eine gute analytische Lösung. ZB entsprechen alle gültigen Lösungen für N = 10
die folgende Liste (bis zu zyklischen Verschiebungen und Umkehrungen):
[7, 5, 6, 4, 8, 2, 10, 1, 9, 3]
Ich möchte nicht zu viel darüber hinaus verraten (obwohl es wahrscheinlich ausreicht, um das Muster herauszufinden). Anstatt weitere Beispiele zu nennen, können Sie überprüfen, ob Ihre Ergebnisse die folgenden quadratischen Gesamtdifferenzen für eine bestimmte Zahl aufweisen 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
Dies ist der OEIS-Eintrag A064842 (der auch einen Verweis auf ein Dokument mit einer Lösung für diese Herausforderung enthält, wenn Sie nicht weiterkommen).
(i<n/2||n%2)^i%2?i+1:n-i
.