Pertimbangkan permutasi nilai integer dari 1
hingga N
. Misalnya contoh ini untuk N = 4
:
[1, 3, 4, 2]
Kami akan mempertimbangkan daftar ini menjadi siklik, sehingga 1
dan 2
diperlakukan sebagai yang berdekatan. Satu kuantitas yang dapat kita hitung untuk daftar tersebut adalah total selisih kuadrat dari nilai yang berdekatan:
(1-3)² + (3-4)² + (4-2)² + (2-1)² = 10
Tugas Anda adalah menemukan permutasi yang memaksimalkan kuantitas ini, diberi bilangan bulat positif N
. Dalam kasus N = 4
contoh di atas tidak optimal (pada kenyataannya, itu minimal). Kami dapat mencapai perbedaan kuadrat total 18
dengan permutasi berikut (serta beberapa yang lain):
[1, 4, 2, 3]
Algoritme Anda harus berjalan dalam waktu polinomial N
. Secara khusus, Anda tidak bisa hanya menghitung perbedaan kuadrat total dari semua permutasi.
Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter function (out).
Output dapat dalam format string atau string yang nyaman, tidak ambigu, datar. Anda dapat memilih untuk mengembalikan daftar dengan nilai dari 0
ke N-1
alih-alih 1
ke N
.
Aturan standar kode-golf berlaku.
Data Uji
Ada solusi analitik yang bagus untuk masalah ini. Misalnya, semua solusi yang valid untuk N = 10
setara dengan daftar berikut (hingga perubahan dan pembalikan siklus):
[7, 5, 6, 4, 8, 2, 10, 1, 9, 3]
Saya tidak ingin mengungkapkan terlalu banyak di luar itu (walaupun mungkin cukup untuk mengetahui polanya), jadi alih-alih memberikan contoh lagi, Anda dapat memeriksa bahwa hasil Anda memiliki perbedaan kuadrat total berikut untuk diberikan 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
Ini adalah entri OEIS A064842 (yang juga berisi referensi ke kertas dengan solusi untuk tantangan ini jika Anda macet).
(i<n/2||n%2)^i%2?i+1:n-i
.