의 정수 값의 순열 고려 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
.