#560(DIV。3)F2ラウンドCodeforces。マイクロトランザクション(複雑なバージョン)(二分)

トピックへのリンク: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 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/xorxor/p/10958911.html