개의 항을 가진 수열 이 있다. 수열의 인접한 항을 교환하는 작업을 최대 번 수행하여 의 값을 가장 크게 만들고 싶다.
번 이하의 작업으로 만들 수 있는 의 최댓값을 출력하는 프로그램을 작성하라.
입력 형식
첫 줄에 수열의 길이를 나타내는 정수 과 교환 작업의 최대 횟수를 나타내는 정수 가 주어진다. ( )
그다음 줄에 수열의 개의 항의 초깃값이 공백으로 구분되어 차례대로 주어진다. 이 값은 모두 이상 이하의 정수다.
출력 형식
첫 줄에 만들 수 있는 의 최댓값을 출력한다.
예제
입력
5 2 3 2 1 5 2
출력
3
예제 설명
예제에서, 첫 번째와 두 번째의 과 를 교환하면 수열은 가 된다. 다시, 네 번째와 다섯 번째의 와 를 교환하면 수열은 가 된다. 이 경우가 을 가장 크게 만들 수 있는 방법이므로 답은 이다.
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 17점
종류 2: 11점
종류 3: 13점
종류 4: 31점
종류 5: 28점
모든 입력 케이스가 주어진다.
해설
수열의 인접한 항을 교환한 뒤 이 번째 항이 되었다고 합시다. 이를 위해서는 최소 번의 교환이 필요하므로 이 성립합니다. 가능한 값들에 대해, 이 번째 항이 되었을 때 남은 교환 횟수로 만들 수 있는 번째 항 중 최댓값을 구하면 문제를 해결할 수 있습니다.
을 번째 항으로 만든 뒤 남은 교환 횟수는 입니다. 따라서 작업이 끝난 후 번째 항이 될 수 있는 후보는,
- 일 때:
- 일 때:
입니다. 이 후보들 중 최댓값은 전처리한 배열을 이용해 쉽게 구할 수 있으며, 전체 시간 복잡도는 입니다.