# (선형 순서 + DP) 루오 구 P2577 [ZJOI2005] 점심 (증가 + / 지방 선거 -)

제목 설명

아침 훈련은 목의 ACM 팀 집단 점심, 그들은 N 열 개 매점의 유명한 라인에 와서 끝났습니다. 사람 만이 Dafan 두 Dafan 창, 매 순간이있다. 모든 사람의 취향 (식욕) 다른, 그래서 그들은 음식을 먹고 싶지는 다른 인해, 그것은 Dafan에 걸리는 시간은 독특하고 개별입니다. 그것은 또한 다를 수 있습니다 먹을 시간이 필요하므로 또한, 각 사람은 같은 속도 없습니다 먹을 수 있습니다.

두 팀으로 나누어 모든 사람의 첫째, 각 하나에 각 팀의 순서를 정렬 한 다음 Dafan을 줄 수있는 번호를 하나의 창에 번호를 하나 개의 팀은 두 개의 번호를하기 위해 두 번째 순위 : 목 ACM 팀의 식사 계획이있다 창 Dafan을 줄 수 있습니다. 모두가 저녁 식사 모두 여섯 개 컬렉션 오후 훈련의 지하실에서 배운했다 직후, 식사 후 즉시 식사를 시작 킥.

이제 최고의 유닛 중 하나의 요청에 따라, 모두 Dafan 시간과 저녁 시간을 주어 방식을 대기하는 것은 식사를 가능한 한 빨리 모든 시간을합니다.

시간이 0에 열 구내 식당에 도달하기 위해 목의 ACM 팀을 가정하고, 다른 학생 (만 Dafan 마스터)를 먹고 어떤 식당이 없다. 모두가해야하며 대열에서 잠시가 될 수 있습니다. 두 창은 서로 독립적으로 병렬로 운영하고 있으며, 식사를 즉시 시작 후 먹을 수 있도록 모두 Dafan 창을 시간 지연없이, 무관하다.

N 지금, 최고의 출력에서 ​​모든 식사를 위해 필요한 시간을 자신의 개인 Dafan 시간과 저녁 식사 시간을 제공.

입력 형식

정수 N의 첫 번째 라인은, N은 각각의 합계를 나타낸다.

두 정수 아이, 동성의 다음 N 라인. 차례로 Dafan 시간과 저녁 시간 나는 사람을 나타냅니다.

출력 형식

저녁 식사를 모두 후 최초의 순간을 대신 정수 T.

샘플 입출력

입력 # 1
5 
2 
7 7 
1 3 
6 4 
8 5
출력 # 1
(17)

설명 / 팁

모든 입력 데이터는 200을 초과하지 않는 양의 정수입니다.

분석 : 첫째, 느리게 먹고, 더 첫번째 Dafan은, 탐욕은 분명히 정확성을 생각;

저녁 식사 시간 순서에서 첫 번째 행에 따르면. 그리고 디자인의 상태를 고려 :

유지 보수 요구 사항 : 사람들의 현재 수, 시간 창 1 호, 제 시간 2 창, 총 최대 시간을;

F는 [I] [j]가 [K]를 I 전에 개별 설정을 나타내고, J는 1 시간에 소비, 최대 2 시간 지출 시각 k;

(치수 감소를 고려? 접두사 Dafan 긴 주문 후 저장 배열을 유지! 그래서 K + J = 합 [I], K = 합 [I] -j 성공 치수 감소!)

F [i]는 각각의 난의 꽃 J 일분 최대 식사에 저장 [J] 전에;

x∈ ([X] [N] F) = ANS 분 [합계 0 [S];

제 i 개인 들어, 그 제 1 또는 제 2 윈도우에 갈 수 있으며, 1 또는 제 2의 원 최대 시간 윈도우에 영향을 미칠 수있다 : 상태 천이 방정식을 고려

제 1 J> =에서 S [I] .A 시간, 즉, i 번째 개별 음식이 시점 J 전에 완료 할 수있는 경우, 다음의 숫자에 대한 영향을 고려

F [I] [J]를 분 = (F [I] [J], 최대 ([I-1] F [JS [I] .A, J + S [I]를 .B)) 효과를 따라!

어느 과거에 긴 시간이 I-1 개인 생산 또는 내가 영향을 미칠 사람!

제 2 호 :

어느 경우에, F [i]는 [J] = 분 (F [I] [J], 최대의 (f [I-1] [J], 합계 [I] -j + S [i]를 .B)); (보다 더 알려진 경우 2 업데이트를 윈도우의 영향을 고려)

AC 코드 :

#INCLUDE <비트 / stdc ++ H.>
네임 스페이스를 사용하여 표준;
CONST의 INT의 N = 210;
INT F [N] [N * N];
구조체 노드
{
를 INT, B;
불리언 연산자 <(노드 Z) CONST
{
리턴 B> ZB;
}
} S [N];
INT 합 [N];
INT의 main ()
{
INT 않음;
scanf와 ( "%의 D", N);
대해 INT (I = 1; 나는 <= N; 내가 ++)
는 scanf를 ( "%의 D % d에", S [i]를 .A, S [i]를 .B);
정렬 (S + 1, S + 1 + N);
대해 INT (I = 1; 나는 <= N; 내가 ++)
합계 [I] = 합계 [I-1] + S [i]를 .A;
memset 함수 (F, 127는 sizeof (F));
F [0] [0] = 0;
대해 INT (I = 1; i가 <= N; 내가 ++)
{
대 (INT J = 0; J <= 합 [I] J ++)
{
만약 F (j> =에서 S [I]로 .a) [I] [J] = 분 (F [I] [J], 맥스 (F [I-1] [JS [I] .A, J + S [I] .B));
F [I] [J] = 분 (F [I] [J], 최대의 (f [I-1] [J], 합계 [I] -j + S [i]를 .B));
}
}
INT ANS = 2147483647;
대해 INT (I = 0; I <=이 합 [N] 난 ++)
ANS = 분 (ANS, F [N] [I]);
의 printf ( "% D \ 없음", ANS);
0을 반환;
}

 

추천

출처www.cnblogs.com/little-cute-hjr/p/11441729.html