개의 정수로 이루어진 수열 가 있다. 이 수열을 의 순열로 바꾸고 싶다. 즉, 부터 까지의 수가 정확히 한번씩 등장하는 수열로 바꾸려는 것이다. 초기 수열에는 보다 큰 값이 등장할 수 있음에 유의하라.
이 목표를 위해 할 수 있는 작업은 임의의 위치의 값을 임의의 정수로 바꾸는 것이다. 단, 번째 값을 바꾸는 경우의 비용은 이다.
주어진 수열을 의 순열로 바꾸는 데 필요한 최소 비용을 계산하는 프로그램을 작성하라.
입력 형식
첫 줄에 수열의 크기를 나타내는 정수 이 주어진다. ()
그다음 줄에 수열의 정보를 나타내는 개의 정수 이 공백으로 구분되어 주어진다. ()
출력 형식
첫 줄에 주어진 수열을 의 순열로 바꾸는 데 필요한 최소 비용을 출력한다.
예제
입력
4 2 1 5 5
출력
7
예제 설명
수열의 세 번째와 네 번째 값을 각각 과 로 바꾸면 된다. 이때, 비용은 이다.
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 31점
종류 2: 14점
종류 3: 17점
종류 4: 38점
추가적인 제한 조건이 없음.
해설
각 위치의 수를 바꿀지 아닐지를 결정하자.
만약 어떤 수가 이상 이하의 수가 아니라면, 반드시 그 수는 바뀌어야 한다.
이상 이하의 수이지만, 자신 위치보다 오른쪽에서 자신과 같은 수가 등장하면, 오른쪽에 있는 수를 고정하고 왼쪽에 있는 수를 바꾸는 것이 비용이 더 적게 든다.
즉, 이상 이하의 각 수에 대해, 가장 오른쪽에 등장하는 수만 고정하고, 나머지를 바꾸면 된다.