#include <ビット/ STDC H ++> 使用して 名前空間STD; constの 整数 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> =; i-- ){ 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] = I; // 初期化IDX、兵士や投球位置 } // 最新各ポータルを読ん防御はところ ため(INT I = 1 ; I <= M; I ++ ){ int型のX、Y、 scanfの(" %D%D "、およびX&Y)。 L [Y] =MAX(L [Y]、X); } //はかどうかトピック解ける決定 IF (チェック()){ プット(" -1 " ); 戻り 0 ; } // この時点まで計算は兵士の数であってもよいがスロー [ 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])){ // 最初の兵士を残すことができない。この点を決定する、なぜなら城を確保することができ、後者は取る //はそうである場合には、城hは以降であるマイナス1 のための(INT J = L [X]; Jが<= N; J ++)H [J] - ; ANS + = C [X]; } } のprintf(" %D \ N- " 、ANS); 戻り 0 ; }
Codeforcesラウンド#608(DIV。2)Dポータル
おすすめ
転載: www.cnblogs.com/QingyuYYYYY/p/12068825.html
おすすめ
ランキング