Codeforces 라운드 # 608 (사업부. 2) D 포털

#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 ; 
}

추천

출처www.cnblogs.com/QingyuYYYYY/p/12068825.html