トピックへのリンク:http://codeforces.com/contest/1165/problem/F2
質問の意味:nは、それぞれのアイテムを購入するアイテムの種類は[i]の作品を購入する必要があり、各アイテムの価格が2bourleあり、m回プロモーション(ディ、Ti)があります:最初の日アイテムTIのDI値は1bourleのために提供しています
あなたはすべての項目に必要な最小日数を買って、その日の1bourleを得ることができます。
アイデア:アイテムの数は日数の増加で得られるので、記事の数はとても最適解の二部を見つけるために、すべてのCNT、[CNT、2 * CNT]の間で日の特定の最小数を提供しています
書式#include <iostreamの> の#include <cstdioを> する#include <アルゴリズム> 書式#include <CStringの> の#include <マップ> 書式#include < 設定 > 書式#include <ベクトル> の#include < 文字列 > の#include <cmath> の#include <キュー> #define(;私は、電子を<++ I I = sのINT)のための担当者(I、S、E) の#define LSONのL、M、RT << 1つ の#define | rsonのM + 1、R、RT << 1 1 の#define P対<整数、整数> STD; typedefの長い ロングLL、 静的 のconst int型 N = 1005 ; 静的 のconst int型 MAX_N = 2E5 + 5。 、 INT A [MAX_N]、B [MAX_N]; ベクター < INT > VEC [MAX_N << 1。]; int型N-; BOOL裁判官(INT X、int型 CNT、ベクトル< INT > VEC []){ int型日= X; // 数日かかり(すなわちbourle得1bourle日として取る) ため(INT I = 1; I <= N; I ++は)B [I] = A [I]; int型の CUR = 0 ; のための(int型、Iは、I = Xを> = 1。 ;){社(www.i-levelmedia.com) // X日プロモーション のためには(INT J = 0 ; J <VEC [I] .size(); ++ J){ int型 T = VEC [I]、[J]; 一方、(B [T] &&日){ // において極力配送購入したアイテム - B [T]; --cnt; // アイテムの合計 --day; // 番号bourle減少 } } しばらく(デイ> = I)++ CUR、--day; // 番号borcleは記事の余分な部分は、プロモーション(ここ良く制御された条件である、ともあればライン)に参加しなかっただけに、数日を超えていない } 戻り CUR> = 2 * CNT; // アイテムが2bourleキャンペーンに参加する必要はない } ボイド(解決){ // freopenは( "INPUT.TXT"、 "R&LT"、STDIN); // freopenは( "output.txtと"、 "W" 、STDOUT); // IOSの:: sync_with_stdio(偽の); int型M、 一方(scanfの(" %のD%のD "、およびN-、&M)!= EOF){ int型 = CNT 0 ; のため(INT I = 0; 私は(MAX_N << < 1)。++ I)VEC [I] .clear(); 以下のために(int型私= 1 ++; iが<= N I){ scanf関数(" %のD "、および[I])。 CNT + = [I]。 } のために(int型 i = 0 ; iがmを<; ++ I){ int型Uを、V。 scanf関数(" %d個の%d個"、&U&V); VEC [U] .push_back(V)。 } int型 L = CNT、R = CNT << 1 。 int型 ANS = 0 ; 一方、(L <= R){ int型の M = L + R >> 1 。 もし(裁判官(M、CNT、VEC)){ R = M - 1 。 ANS = M。 } 他 L = M + 1 。 } のprintf(" %d個の\ n " 、ANS)。 } } int型のmain(){ )(解きます。 リターン 0 ; }