#INCLUDE <비트 / STDC H ++.> 은 USING 스페이스 STD; CONST INT N = 5010 ; INT N-, m, K; INT A [N], B [N], C는 [N]는, //는 필요한 수의 침입 얻기 개수, 보너스 포인트 INT L [N], D [N], F [N], H는 [N]을, //는 I I 병사의 누적 최대 수의 군인 캡처 최신 점을 폐기 할 수 있으며,이 점은 일 수있다 군인의 수는 던져 INT IDX을 [N] INT ANS; // 이 문제가 해결책 및 접두사를 찾을 수있는 방법이없는 경우 참조 : D를 [I] = B [. 1] + ... + B [N-] BOOL의 확인 () { INT의 P = K] 대 ( INT I = 1. ; I <= N-; I ++ ) { IF (P <A [I]) 창 1. ; P + = B [i]는, D [I] = P; // D [i]는 i가 시점까지 누적 된 군인들의 최대 개수 } 반환 0 ; } BOOL CMP ( INT의 A, INT B) { // 따라 점수 크기 순서 복귀 C [A]> C [B]를; } // 이 점 분석하는 군인 던질 수 BOOL CHECK2을 ( INT X) { 대 ( INT I = N-; I X> =, 난 - ) { IF (H [I] == 0 ) 복귀 0 ] // 군인 던질 수없는 후면 포인트가있는 경우,이 포인트는 군인 던질 수 } 복귀 . 1 ; } 값 int () {본체 는 scanf ( " % D % D % D " , 및 N-, m, K)을, 대 ( INT I = 1. ; I <= N-; I ++ ) { 는 scanf ( " % D % D % D " , A & [I], B [I], C [I]) L [I] = I, IDX [I] = 1; // 초기화 될 IDX, 군인 투사 위치 } // 최신 각 포털 읽기 방어 한 부분 에 대해 ( INT I = 1. ; I <= m; I ++ ) { INT의 X, Y] 는 scanf ( " % D % D ' , X, Y); L [Y] =최대 (L [Y], X는) } // 항목이 실밥의 여부를 판정 IF는 (체크 ()) { 박았가 ( " -1 " ) 복귀 0 ; } // 이 시점에 산출하는 병사의 수가 던질 수있다 A [ N- + . 1 ] = 0 ; 대 ( INT I = 1. ; I <= N-; I ++ ) { H [I] = D [I] -a [I + 1이다. ]; } // 의 득점 랭킹 크기에 따라 idx 그 것이다 정렬 (IDX + . (1) , IDX + 1. + N-, CMP); // 캡쳐 분획 내림차순 대 ( INT I =. (1) , I <= N-; I ++ ) { // 먼저 제거 큰 소수 INT X = IDX [I]는, IF 합니다 (CHECK2 (L [X])) { // 먼저 병사 떠날 수 없다 시점을 결정하기 때문에 성을 보장 할 수 후자 걸릴 //이 그렇다면 성 시간 이후이어야 뺀 대 ( INT J = L [X] J를 <= N-, J ++) H [J] - ; ANS + = C [X]; } } 의 printf ( " % D \ N- " , ANS) 복귀 0 ; }
Codeforces 라운드 # 608 (사업부. 2) D 포털
추천
출처www.cnblogs.com/QingyuYYYYY/p/12068825.html
추천
행