POJ 3614

それは貪欲と優先度キュー、解決することは非常にスマートです。 

  この欲は非常に巧妙なああです

 

#include <iostreamの> 
する#include <cstdioを> 
する#include <cstdlib> 
の#include <CStringの> 
する#include <cmath> 
の#include <CCTYPE> 
の#include <アルゴリズム> 
の#include < ストリング > 
の#include <ベクトル> 
の#include <リスト> 
書式#include < 設定 > 
書式#include <マップ> 
書式#include <スタック> 
の#include <キュー>
 使用して 名前空間はstdを、

typedefのペア < int型int型 > P;
int型C、L;
 のconst  int型 MAX_C = 2500 ;
 のconst  int型 MAX_L = 2500 ; 
P A [MAX_L];          // ストア日焼け止め 
PのB [MAX_C];          // ウシ格納する
 // qソート順序関数
INT CMPを(CONST  空隙 *、CONST  ボイド *のB){ 
    Pの * AA =(P * )A; 
    P * BB =(P * )B;
     戻り AA->まず> BB->まず?1: - 1 ;       // SPFが順序付けされます優先
} 

INT(メイン)
{ 
    CIN >> C >> L。
    Pの一時。
    PRIORITY_QUEUE < int型、ベクトル< int型 >、大きい< int型 >> PQUE。             // 注意是由大到小出现的
    ためint型 i = 0 ; iはCを<; iは++ ){ 
        scanf関数(" %d個の%のD "、&​​B [i]が1次回、&B [i]は.second)。
    } 
    のためのint型 I = 0 ; iがLに<; Iは++ ){ 
        scanf関数(" %d個の%のD "、&​​[i]が1次回、&[I] .second)。
    升序排序、完成对优先队列的存储 
    のqsort(L、はsizeof([ 0 ])、CMP)。
    qsort(B、C、はsizeof(B [ 0 ])、CMP)。
   / * printfの( "ボトルを表示\ n個!"); 
    (; iがLに<; iが0 = int型私は++)のためのprintf( "%D%D \ n"は、[I] 1次回、[I] .second)。プット( ""); 
    printf( "COWを表示します:\ n"); 
    {ため(; iはCを<I ++はI = 0 INT)
        のprintf( "%D%D \ n"、Bを[I] 1次回、B [i]は.second)。
    } * / 
    INT RES = 0int型 J = 0 ;
    
    ; Iは、Lを<; Iは++){      // 配列の日焼け止めがトラバース
        しながら(J <&& A C [I] 1次回> = B [J] 1次回){ 
            pque.push(B [J] .second)を; // 牛の最大値は、プライオリティキュー、彼は最小(課長)です満足しなければならないので、私たちはここを参照してください彼の最大値(テール部分)への鍵である 
            Jは++ ; 
        } 
        しばらく(PQUE!空の()&& A [I] .second){     // キューが空でない場合、日焼け止め未使用
            INT X = pque.top(); pque.pop(); // プライオリティキューを取り出して
            IF(X < I]は1次回)   続行 ;    // ヘッド会うのが、テール部分満たさない 
            RESを++; [I] .second--;   // 答えのため、そして日焼け止めの数を更新
        } 
    } 
    (のprintf "%D \ n " 、RES);
     戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/lucky-light/p/11431504.html