문제 링크
- http://icpc.me/12776
문제 출처
- 2016 ICPC World Finals L번
사용 알고리즘
- 그리디
시간복잡도
- $O(N \log N)$
풀이
Exchange Argument를 이용해 그리디 풀이를 생각해봅시다.
$N = 2$이고, $i$번째 드라이브의 old file system에서의 용량을 $A_i$, new file system에서의 용량을 $B_i$라고 합시다.
만약 $B_i - A_i \geq 0$ 이면서 $B_j - A_i \le 0$이라면 i번째 드라이브를 먼저 포맷하는 것이 항상 이득입니다. 하지만 둘 다 0 이상이거나 둘 다 0 미만일 때는 어떤 순서로 포맷을 해야 최적이 되는지 쉽게 알 수 없습니다.
- 첫 번째 드라이브를 포맷한 뒤에 두 번째 드라이브를 포맷한다면 용량이 $\max{A_1, A_1-B_1+A_2}$인 extra drive가 필요합니다.
- 두 번째 드라이브를 포맷한 뒤에 첫 번째 드라이브를 포맷한다면 용량이 $\max{A_2, A_2-B_2+A_1}$인 extra drive가 필요합니다.
먼저 $B_i - A_i$와 $B_j - A_j$가 모두 0 이상인 경우를 생각해봅시다.
- i번째를 먼저 포맷하는 경우 용량이 $\max{A_i, A_i-B_i+A_j}$인 extra drive가 필요합니다.
- j번째를 먼저 포맷하는 경우 용량이 $\max{A_j, A_j-B_j+A_i}$인 extra drive가 필요합니다.
$A_i \le A_j$일 때 i번째를 먼저 포맷하는 것이 이득이라는 것을 보일 것입니다.
- $A_j$는 $A_i$보다 큽니다.
- $A_i-B_i \leq 0$이므로 $A_j$는 $A_i-B_i+A_j$보다 크거나 같습니다.
- $\max{A_j, A_j-B_j+A_i}$는 $A_j$보다 크거나 같습니다.
그러므로 i번째 드라이브를 먼저 포맷하는 것이 이득입니다.
$B_i - A_i$와 $B_j - A_j$가 모두 0 미만인 경우에도 비슷한 과정을 거쳐 $B_i$가 큰 것을 먼저 포맷하는 것이 이득이라는 것을 보일 수 있습니다.
비교 함수를 적절히 구현해서 정렬해주면 문제를 풀 수 있습니다.
전체 코드
1 |
|