60036 블록 쌓기 Platinum II
문제
블록을 쌓는 놀이를 하고 있다. 블록을 위로 쌓을 수 있는 칸들이 총 개 있으며, 번 칸부터 번 칸까지 순서대로 붙어 있다.
현재 번 칸에는 개의 블록이 쌓여 있다. 현재 블록들이 쌓인 모양이 난잡하다고 생각해, 다음과 같은 조건들을 만족하도록 블록들을 옮기려고 한다.
- 각 칸에 쌓인 블록의 개수는 이상 이하이다.
- 각 칸에 쌓인 블록의 개수는 단조증가한다: 에 대해 번 칸에 쌓인 블록의 개수는 번 칸에 쌓인 블록의 개수 이하이다.
여러분은 어떠한 칸의 블록을 인접한 칸으로 옮기는 것을 반복해 목표를 달성하려고 한다. 목표를 달성하는 것이 가능한지 판별하고, 가능한 경우 블록을 옮기는 횟수의 최솟값을 구해야 한다.
입력
첫 번째 줄에 , , 이 공백으로 구분되어 주어진다.
두 번째 줄에 , , 이 공백으로 구분되어 주어진다.
출력
목표를 달성하는 것이 불가능하다면 을 출력한다. 목표를 달성하는 것이 가능하다면 블록을 옮기는 횟수의 최솟값을 출력한다.
제한
- ()
- 주어지는 수는 모두 정수이다.
서브태스크
| 번호 | 배점 | 제한 |
|---|---|---|
| 1 | 7 | , |
| 2 | 6 | , |
| 3 | 11 | , |
| 4 | 11 | , |
| 5 | 30 | , |
| 6 | 10 | , |
| 7 | 25 | 추가 제약 조건 없음. |
예제 입출력
예제 입력 1
5 3 5
2 0 9 1 4
예제 출력 1
7
예제 입력 2
10 3 8
2 7 9 10 2 2 2 8 3 8
예제 출력 2
25
예제 입력 3
10 6 7
10 7 5 4 4 3 9 4 9 7
예제 출력 3
20
예제 입력 4
3 2 3
1 1 1
예제 출력 4
-1
출처
올림피아드 › 한국정보올림피아드 › KOI 2023 1차 › 고등부 3번
solution.cpp
에디터 불러오는 중...