문제
풀이
$j - 1$번째 차의 작업을 시작하고 나서 $j$번째 차의 작업을 시작하기까지의 시간을 $d$라 합시다. $d$에는 쉬는 시간 뿐 아니라 작업 시간도 포함되어 있음에 유의합시다.
$S_n = \sum_{k = 1}^n T_k$으로 정의하면 $d$는 모든 $i$에 대해 부등식 $d + S_{i - 1}F_j \ge S_iF_{j - 1}$을 만족해야 합니다.
이는 $j$번째 차의 작업의 시작 시간(좌변)이 $j - 1$번째 작업의 끝(우변) 이후여야 함을 뜻합니다.
해당 부등식을 변형하면 $d \ge S_iF_{j - 1} - S_{i - 1}F_j$입니다. 따라서 우변의 최댓값이 $d$의 최솟값이 됩니다.
정확히는 상근이의 작업시간까지도 포함해야 하므로 우변의 최댓값과 $T_1F_{j - 1}$중 최댓값이 $d$의 최솟값이 됩니다.
우변을 $F_j$로 묶으면 $F_j\left(S_i\dfrac{F_{j - 1}}{F_j} - S_{i - 1}\right)$ 이고 이는 변수가 $F_{j - 1} / F_j$, 기울기가 $S_i$, y 절편이 $-S_{i - 1}$인 직선에 $F_j$를 곱한 것으로 볼 수 있습니다.
따라서 볼록 껍질을 이용한 최적화를 사용하면 시간 복잡도 $\mathcal{O}(N + M\log N)$에 해결할 수 있습니다.
코드
1 | |