주제 : https://www.luogu.org/problemnew/show/P2577
질문의 의미 : N 모두가 Dafan 시간과 저녁 시간에 개인이있다, 그들은 두 팀으로 구분됩니다. 즉시 히트 쌀 후 모두가 먹을 수 있습니다. 당신이 먹는 짧은 시간에 대한 전반적인 준비를하는 방법을 문의하십시오.
아이디어는 첫째, 탐욕은 여전히 좋은 생각이다. 총 시간은 실제로 최신 기간 + Dafan 끝을 먹을 시간이 팀을 먹을 수 있습니다.
저녁 식사 후, 팀의 앞에있는 사람들은 그들이 총 시간 대기 시간을 초과하지 않는 경우를 고려해야 할 필요가 없습니다. 배치하는 경우 시간의 큐잉 팀은 고정된다. 그것은 중요하지 않습니다 배열의 순서로.
그래서 우리는 앞으로 넣어 먹는 데 시간이 오래 소요됩니다. 큐잉 시간 저녁 식사가 아니라이 영향을주기 때문에 시간의 순서는 순서에 의해 영향을 받는다.
그리고 우리는 그들이 두 팀으로 나뉘어 제공하는 방법을 고려할 수 있습니다.
우선, $ DP 고려 [I] [J] [K]는 $ i가 고려 개별 복용 $ 제 $ 팀 라인업 번째 팀 $ K $ 모든 제 먹을 대기 시간 $의 j 개의 $이다 처음 나타낸다 식사 시간을 종료합니다.
두 팀은 시간을 대기하는 것은 고정 전체적 때문에, 우리는 관계가 $이 $의 J의 $ 및 $ K를 발견했다. 그래서 우리는 대기열 시간을 유지하기 위해 $ 합계 [i]는 $ 접두사를 사용할 수 있습니다. 당신의 크기를 줄일 수 있습니다.
그래서 우리는 $ i가 계정에 개인을 복용 $ 최초의 $를 대표하는 $ DP [I] [J]를 사용하여, 첫번째 팀 라인업는 $ J의 $ 처음으로 모든 식사 시간입니다. 이 때, 두 번째 팀이 명확 $ 합계 시간이되어 대기한다 [내가] - J의 $
[J] - 후 [I] [J] = 분 (최대 (DP [I-1] [j는-얻을 [I], J + 먹을 [I]), 최대 (DP [1 I] DP가 $ 합계는 [내가] - J +는 [I])) $ $ I $이 두 번째 위 개인과 팀의 첫번째 팀의 첫 번째 행을 나타냅니다 먹는다.
1 #INCLUDE <cstdio> 2 #INCLUDE <cstdlib> 3 #INCLUDE <지도> 4 #INCLUDE < 설정 > 5 #INCLUDE <CString을> 6 #INCLUDE <알고리즘> 7 #INCLUDE <벡터> 8 #INCLUDE <cmath> 9 # <적층> 등 10 #INCLUDE <큐> 11 #INCLUDE <iostream> 12 13 #DEFINE INF 0x3f3f3f3f 14 이용한 스페이스 성병; 15 타입 정의 긴 긴 LL; 16 의 typedef 쌍 < INT ,INT > PR; 17 (18) INT의 N; 19 CONST의 INT의 maxn = 205 ; 20 구조체 노드 { 21 INT의 리스팅 먹고; 22 } STU [maxn]; 23 INT의 합 [maxn]; 24 INT의 DP [maxn] maxn maxn * * 2 ]; 25 26 부울 CMP (노드 A, 노드 B) (27) { 28 창 > a.eat b.eat; 29 } 30 31 INT의 주 () 32 { 33 scanf와 ( " %의 D ' , N); 34 memset 함수 (DP, 0x3F입니다 , 는 sizeof (DP)); (35) 에 대한이 ( int로 I = 1 난 ++; i가 N = < {) (36) 는 scanf ( " %의 D % d에 " , STU [I]. 얻는 , STU [I] .eat)를; 37 } 38 정렬 (STU + 1 , STU + 1 + N, CMP); 39 (40) 에 대해 ( int로 I = 1 난 ++; i가 N = < {) 41 합 [I] = 합계 [내가 - 1 ] + STU [I]. 얻을 ; 42 } 43 DP는 [ 0 ] [ 0 ] = 0 ; (44) 에 대한이 ( int로 I = 1 ; i가 N = <; 내가 ++ ) { 45 대 ( INT J = 0 ; J <= 합 [I]가, J ++ ) { 46 의 경우 . (J> = STU [i]를 얻을 [DP)를 I] (j]가 최소 DP = [I] [J], 최대 (DP [전 - 1 . [J - STU [i]를 얻을 , J + STU [I] .eat)); (47) (DP)는 [I]은 [J]를 분 (DP [I] [J], 최대 (DP를 = I - 1[J], 합계 [I] - J + STU [I] .eat)); 48 } 49 } 50 51 INT ANS = INF; 52 대 ( INT의 J = 0 ; J <= 합 [N] J ++ ) { 53 ANS = 분 (ANS, DP [N] [J]); 54 } 55 의 printf ( " % D \ 없음 " , ANS); 56 반환 0 ; 57 }