루오 구 P2577 급식 선형 [그리] [DP]

주제 : 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 }

 

추천

출처www.cnblogs.com/wyboooo/p/11106723.html