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