Розглянемо перестановку цілих значень від 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
.