基本的な考え方:
一言で言えば、多くのニーズを、ソートの数を要求する最低限の要件を満たすために、彼のオリジナルの一部を取り戻すために、長い出会い、貪欲です。
実際には、OSの銀行家のアルゴリズムのレプリカがあります。
キーポイント:
状況は完全な需要の数、見て必要性を持っている数よりもケース四十五パーセントの大きいがあることに注意してください。
#include <iostreamの> する#include <STDLIB.H> する#include <stdio.hに> する#include <ベクトル> の#include <ストリング> の#include <math.h>の 書式#include <アルゴリズム> の#include <CStringの> する#include <地図> 書式#include <キュー> の#include <設定> 書式#include <スタック> std名前空間を使用しました。 構造体ノード{ int型xuyao。 yiyouをint型。 }。 ベクター<ノード> VEC。 ベクトル<文字列>のres; 整数M、N。 ブールCMP(ノードA、ノードB){ 戻りa.xuyao <b.xuyao。 } メインINT(){ CIN >> M。 int型のA、B; {(; I <M I ++ iが0 = INT)のため VEC。(0)リサイズ。 cinを>> N; int型CNT = 0; ブールフラグ= TRUE。 以下のために(INT I = 0、I <N; I ++){ CIN >> B。 (> = B)であれば{ CNT + = A。 } {他 のないノード。 no.xuyao = B - 。 no.yiyou =; vec.push_back(NO)。 } } ソート(vec.begin()、vec.end()、CMP)。 用(INT iは= 0; I <vec.size(); I ++){ IF(VEC [i]が.xuyao <= CNT){ //如果可以分配; CNT + = VEC [i]は.yiyou。 } 他{ //如果不可以分配; フラグ= FALSE。 ブレーク; } } (フラグ)場合 res.push_back( "YES")。 そうしないと res.push_back( "NO"); } (自動ELE:RES)のために{ COUT << ELE << ENDL。 } 0を返します。 }