개의 항을 가진 수열 가 있다. 각 항에 을 더하거나 빼는 연산을 수행할 수 있다. 단, 이 연산은 항 하나에 최대 한 번만 적용 가능하다. 즉, 의 번째 항의 값이 초기에 로 주어졌다면, 최종적으로 번째 항의 값은 연산을 수행하지 않은 경우에는 , 연산을 수행한 경우에는 혹은 중 하나가 가능하다.
최소한의 연산으로 수열 가 공차 인 등차수열이 되도록 만드는 프로그램을 작성하라.
여기서 공차 인 등차수열이라 함은, 인 모든 정수 에 대해, 번째 항 에서 번째 항 를 뺀 값이 임을 뜻한다.
입력 형식
첫 줄에 수열의 길이를 나타내는 정수 이 주어진다. ()
그다음 줄에 수열의 개의 항의 초깃값이 공백으로 구분되어 차례대로 주어진다. 이 값은 모두 이상 이하의 정수다.
항상 연산을 적절히 사용하여 공차 인 등차수열을 만들 수 있는 경우만 입력으로 주어진다.
출력 형식
첫 줄에 최소 연산 횟수를 출력한다.
예제
입력
5 1 3 4 5 5
출력
2
예제 설명
한 번의 연산으로 수열의 첫 번째 값을 로 바꾸고, 또 한 번의 연산으로 수열의 마지막 값을 으로 바꾸는 것이 최적이다. 이 경우, 최종적으로 수열은 이 된다.
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 34점
수열의 항의 초깃값은 모두 이하.
종류 2: 25점
종류 3: 41점
모든 입력 케이스가 주어짐.
해설
주어진 문제는 공차가 인 등차수열을 만들기 위해 각 항을 그대로 두거나, 을 더하는 연산을 수행하여, 연산 횟수를 최소화하는 것을 목표로 합니다.
이를 해결하기 위해 먼저 주어진 수열의 각 항에서 해당 인덱스를 빼서 새로운 수열로 변환합니다. 이 변환된 수열의 각 항은 초기값에서 인덱스를 뺀 값으로 정의되며, 이를 통해 문제를 "모든 항을 같은 값으로 만드는 문제"로 변형할 수 있습니다.
수열의 모든 수를 어떤 수 로 만든다고 하면, 수열의 모든 수는 이상 이하여야 합니다. 그리고 수열의 모든 수를 로 만들기 위한 연산 횟수는 수열에서 가 아닌 수의 개수가 됩니다.
가능한 의 종류 수가 최대 개이므로, 가능한 모든 후보에 대해 연산 횟수를 구하고 그중 가장 작은 값이 답이 됩니다. 이 문제를 해결하기 위한 시간 복잡도는 입니다.