リンクします。https://codeforces.com/contest/1282/problem/C
質問の意味:試験を取るために男、試験2つだけ質問、1は、それぞれの質問には時間がかかり、固定され、簡単な質問であり、もう一つはそのBを確保するために、各質問には時間がかかり、固定bは、難しい質問です>。スコアは1であるという問題を解決します。ルール筆記試験等だけの質問はありませんが、どのくらい、事前に割り当てを奨励します。あなたが事前に割り当てられていない場合は、件名に「質問を行う必要がありますが、」完全にしても0の場合、このコースを完了することはありませんときタイトルの一部は、「必須-doの問題」として表示されますが、それ以外の場合、質問の数は同じスコアを得るために、 「しなければならない」と「非必須DO」を含みます。
問題の意味:それは質問の明確な意味が注文アップ、そして貪欲DOを昇順で「時間を行う必要があります」のタイトルで必要とされるが、各質問をされた横断時の初めから行う必要があります。i番目のタイトルの横には、現在の時刻がTである場合は、T-1時点での割り当ては、あなたが最初の必要性は、このプロセスはTの後、残り時間Tiを、取ったと仮定して、行わなければならないすべての質問の前に置く場合 - チタン時間、我々は常に更新ANSは、単純な質問の残りの部分を最初に行うために非常に可能な限りすべてのトピックを続け、この時間ANSで記録パズルを、行い、残りの時間で貪欲されている最後の時間を行う必要があります最大。最終ANSは答えであります
ACコード:
1の#include <iostreamの> 2の#include < ストリング > 3の#include <ベクトル> 4の#include <CStringの> 5の#include <cstdioを> 6の#include <アルゴリズム> 7 使って 名前空間STDを、 8 typedefの長い 長いLL。 9 LL MOD = 1E9 + 7 。 10 CONST INT MAXN = 2E5 + 10 。 11 構造体ノード{ 12 INT DIF。 13 INT TI。 14 } G [MAXN]。 15 ブールCMP(ノードA、ノードB){ 16 であれば(!a.ti = b.ti)リターン a.ti < b.ti。 17 リターン a.dif < b.dif。 18 } 19 INT メイン(){ 20 のint Q; CIN >> Q。 21 一方(q-- ){ 22 LL N、T、B。 23 CIN >> N >> T >> B。 24 LL CNTA = 0、CNTB = 0 。 25 のために(INT iは= 1 ; iが<= N; I ++ ){ 26 、INTTD; CIN >> Tdを、 27 IF(TD == 0)CNTA ++ ; 28 他 CNTB ++ ; 29 G [I] .DIF = TD; 30 } 31である ため(INT I = 1 ; I <= N; I ++ ){ 32 INT T; CIN >> T、 33は G [I] .TI = T; 34である } 35 ソート(G + 1、N - + G + 1、CMP); // プレス時間ソートするでしょう 36 G [N - +を1。 .TI] T + = 1; 37 [ LL ANS = 0、C1 = 0、C2 = 0 ; // C1 C2は、対象尽くす数をカウント 38である ため(INT I = 1 ; I <= N + 1 ; I ++ ){ 39 LL CUR = A * C1 * B + C2; 40 LL時間= G [I] .TI - 1 - CUR; //は、被験者にかかる時間尽くす 41で IF(時間> = 0){ // 余分な時間がある場合は、としてより多くのことを行いますより簡単な質問、問題が行う 42である LL TA =分(時間/、cnta- C1)、 43は 時間- TA * = 。 44 LL TB =分(時間/ B、cntb- C2)。 45の ANS = MAX(ANS、C1 + C2 + + TA 、TB)。 46 } 47 であれば(G [i]が.DIF == 0)C ++ 。 48 他の C2 ++ ; 49 } 50 COUT << ANS << ENDL。 51 } 52 リターン 0 。 53 }