それは貪欲と優先度キュー、解決することは非常にスマートです。
この欲は非常に巧妙なああです
#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 = 0。 int型 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 ; }