poj1505(バイナリ貪欲+)

「可能な限り小さく、最大は」非常に一般的な最適化の目標です。

書籍に関する揚げ。

このトピックを見て:

http://poj.org/problem?id=1505

次のようにコードの私のコピーは、次のとおりです。

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
名前空間stdを使用。
int型のブック[505]。
ブールフラグ[505]。
int型M、K。//メートル:図書の数。K:スクライバーの数。
int型のCNT; // CNTは、カウントの略です。
INTコピー(長い長いX)
{ 
    CNT = 1。
    長い長い合計= 0; 
    memset(フラグ、偽、はsizeof(フラグ))。
    
    (I = M-1 int型; I> = 0; i--)のために
    { 
        和+ =ブック[I]。
        (和> X)であれば
        { 
            CNT ++。
            合計=ブック[i]は、
            フラグ[i]が真=。
        } 
 
    } 
    CNTを返します。
} 

ボイドプリント() 
{
    printf( "%d個"、ブック[0])。
    以下のために(; iがm <I ++はI = 1 INT)
    { 
        IF(フラグ[I-1])のprintf( "/")を。
        printf( "%d個"、ブック[I]); 
    } 
    のprintf( "の\ n"); 
} 

int型のmain()
{ 
        int型のT。
        scanf関数( "%のD"、&T)。
        長い長L、R。
        (T--)一方
        { 
            scanf関数( "%d個の%のD"、&M、およびK); 
            L = R = 0。
            以下のために(; iがm <I ++は、I = 0 INT)
            { 
                scanf関数( "%d個"、&ブック[I])。
				(ブック[I]> L)、L =ブック[i]の場合、
                R + =ブック[I]。
            } 
            
            長い長いミドル。 
                半ば=(L + R)/ 2。
                IF(コピー(MID)<= K)、R =ミッド。
                他リットル=ミッド+ 1; 
            } 
            int型CNT =コピー(R)
            以下のために(; && iがm <CNTを<K、I = 0 int型私は++)
            { 
                もしフラグ[I] =真、CNT ++(フラグ[i]が!)。
            } 
          印刷()。
        } 
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/dragondragon/p/11373604.html