[제목] 효과
$ $ N-작업을 특정 순서로 처리 할 수있다,는 I $ $ $ T_i 작업은 $을 완료하는 데 시간이 걸립니다. 각 일괄 처리 작업을 시작하기 전에 컴퓨터를 시작하는 데 시간이 $의 S $으로 보내고, 처리에 대한 몇 가지 배치로 나눌 수 있습니다. 시간 $ 0 $의 시작 부분에서 $ i는 수수료의 첫 번째 작업을 완료하는 데 $ $ C_I $가 완료 시간 $ 곱입니다 (각 작업 완료 시간에 대한 작업 완료 시간의 수를 마지막으로 $ 작업을 경우 $) $, 최소 총 비용을 찾을 수 있습니다.
[분석] 아이디어
우선 간단하게 생각할 제공 $의 F는 $ J $ 배치 최소 전체 비용에 $가 $ I $ 태스크, 전사 식 $의 F [I] [J] = 분 \ {F의 [전면 완료 [I] [J]이다 K] [J-1] + (S의 *의 J + \ sum_ {X = 1} ^ {I} T_x) * \ sum_ {X = K + 1} ^ {I} C_x \} (0 \ 르 K <I) $
분명히 시간 복잡도는 $ O (N ^ 3) $이며, 이것은 우리가 최적화하는 방법을 고려, 이상 확실하지 않다.
사실 우리는 컴퓨터를 다시 시작할 때마다이 시간의 상당 동시에 플러스 $ S의 $에서 모든 후속 작업을 완료하는 데, 그것은 우리가 앞으로 몇 개의 그룹으로 구분 된 작업을 알 필요가 없습니다 말을하는 것입니다.
제공자 $의 F는 [I]는 $ 전에 완료 나타내고 $ I $의 $ 태스크 최소 전체 비용 $은 $ ㅂ 전사 식 (나머지 태스크 걸리는 여분 $ S $으로 시간 $ 비용 포함 $) [I] = F 분 \ {[J] + \ sum_ {X = 1} ^ {I} T_x * \ sum_ {X = J + 1} ^ {I} C_x + S * \ sum_ {X = J + 1} ^ { N} C_x \} (0 \ 르 J <I) $
[] 코드 구현
1 #INCLUDE <cstdio> 2 #INCLUDE <iostream> 3 #INCLUDE <CString을> 4 #INCLUDE <알고리즘> 5 #INCLUDE <cmath> 6 #INCLUDE <큐> 7 #DEFINE의 g () getchar가 () 8 #DEFINE의 RG 레지스터 9 #DEFINE의 이동 (I는은 b)에 대한 (RG의 INT 난 =; 나는 <= B를 단계; 내가 ++) 10 #DEFINE 백 (I, a가, b) (RG의 인터넷 용 난 =; I> = B; 난 -) 11 #DEFINE의 DB 이중 12 #DEFINE이 줄게 긴 길이 13 #DEFINE IL 인라인 14 #DEFINE PF printf의 15 #DEFINEMEM (a, b)가 memset (A, B를 sizeof (a)) (16) 를 사용 스페이스 성병; 17 LL의 FR () { 18 = w LL 0 , Q = 1 ; 19 숯 CH = g (); 20 동안 (CH2 < ' 0 ' || CH> ' 9 ' ) { 21 일 경우 (CH2 == ' - ' ) Q = - 1 ; 22 CH = g (); 23 } 24 동안 (CH2> = ' 0 ' && CH <=에서 ' 9' ) (w = w << 1 ) + (w << 3 ) + CH- ' 0 ' , CH = g (); 25 창 * w의 Q; 26 } 27 CONST의 INT에서 N = 5002 ; 28 INT의 N, S; 29 LL의 F [N], 세인트 [N], SC [N]; 30 INT 의 main () { 31 // freopen을 ( "", "R", 표준 입력); 32 // freopen을 ( "", ""w, 표준 출력); 33 N의 FR = ()의 S = FR (); 34 이동 (I, 1 , n)의 일 [I] = 세인트 [I- 1 ] + FR (), SC [I]는 SC = [I- 1+ FR (); 35 MEM (F, 0x3F입니다 ) [F 0 ] = 0 ; 36 이동 (I, 1 , n)은 이동 (j, 0 , I- 1 ) 37 F [I] = 분 ([I], F [J] 일 F + [I] * (SC [I] -sc [ J]) + S *의 (SC [N] - (SC) [J])); 38 PF ( " % LLD \ 없음 ' , F [N]); 39 반환 0 ; 40 }