木材加工

リンク:https://ac.nowcoder.com/acm/contest/890/J
出典:牛オフネットワーク

制限時間:C / C ++ 6秒言語他に3秒
間隔の制限:C / C ++ 524288K、他の言語1048576K
64ビットIOフォーマット:%のLLD

タイトル説明

木材業界では、厚板を組み合わせることで、大きな木のボードを作ることは非常に一般的です。基板に複数厚板を組み合わせるために、大工は全て厚板の高さが等しくなるように、水平に厚板の一部を切断し、二つの部分の一方を破棄してもよいです。その後、厚板は大きな木板を形成し、一緒に結合されています。ボードの高さは、厚板の一般的な高さ、ボードの幅が厚板の幅の合計です。

しかしながら、厚板を切断することは巨大な浪費をもたらすことができます。この問題は、所与のN厚板は、これら厚板からk個のボードを作るために厚板の最小合計無駄な領域を決定します。あなたは自由に並べ替えると、これらの厚板を組み合わせることができます。板の機械的性質が異方性であるので、あなたが厚板を回転させることができないことに注意してください。また、全ての厚板を使用する必要があります。あなたは、任意の整数板を破棄することはできません。

説明を入力します。

入力の最初の行は、N二つの整数、K含有1 \当量のK \当量2000、K \当量のN(1≤n≤5000,1≤k≤2000、k≤n)(1 \当量のn \の当量5000、 )1 N 5 0 0 0 1 K 2 0 0 0 k個の≤のN )、所定の厚板の数とにするボードの数を表します。

残りのn行のそれぞれ2つの整数を含む時間、W (1≤w、h≤107)(W 1 \当量、時間の\当量10 ^ 7) 1 W H 1 0 7)、幅及び所定の板の高さを示します。

出力説明:

出力整数として最小無駄な領域。
例1

エントリー

コピー
3 2 
3 3 
4 7 
2 5

輸出

コピー
4
例2

エントリー

コピー
6 3 
1 1 
1 2 
1 3 
1 4 
1 5 
1 6

輸出

コピー
3
#include <cstdioを> 
する#include <CStringの> 
する#include <iostreamの> 
する#include <アルゴリズム> 使用して名前空間STDを、
typedefの長い長いLL。
const int型 MAXN = 1E5 + 10 構造体ノード{ 
    W LL、H。
} [MAXN] C。
LL N、K。
LL和[MAXN]、E [MAXN]。
LLヴァル[ 5006 ] [ 5006 ]。
LL DP [ 5006 ] [ 5006 ]。
BOOL CMP(ノードS、ノードT){
     戻り SH < 番目。
} のボイド

   

(CUR -1,11,11-のL、R LL、QL -1,11,11- QR){解く
     場合(L> R)のリターン; 
    中間LL = L + R >> 1 
    LL Q = 0 (LL I = QLレジスタ; iが中間&& I <= QRを<; ++ i)が{ 
        にLL = DP [cur- 1 ] [I] +ヴァル[I + 1 ] [中間]。
        もし(>にDP [CUR] [中間]){ 
            Q = I。
            DP [CUR] [中間] = であり;
            // coutの<< "デバッグ" << DP [CUR] [中期] <<てendl; 
        } 
    } 
    (CUR、Lを解決するため、ミッド - 1は、QL、q)を。
    (CUR、ミッド解決 ] + C [i]は.W *+ 1 、R、Q、QR)。
} 
int型のmain()
{ 
    // freopenは( "1.TXT"、 "R"、STDIN)。
    scanf関数(" %のLLDの%のLLD "、&​​N&K)。
    ため(登録LL I = 1 ; I <= N; ++ I){ 
        scanf関数(" %のLLDの%のLLD "、&​​C [i]は.W、&C [I]・H); 
    } 
    ソート(C + 1、C + 1 + N、CMP)。
    以下のために(LL I =レジスタ1 ; I <= N; ++ I){ 
        和[i]は =合計を[I- 1 C [I]・H。1 ] + C [i]は.W。
        // coutの<< "デバッグ和[I] =" <<合計[i]は<<てendl; 
    }
     ため(登録LL I = 1 ; I <= N; ++ I){
         ため(登録たLL J = I; J <= N; ++ J){ 
            ヴァル[I] [J] =(E [J] -e [I- 1 ])* C [I]・H。
        } 
    } 
    ため(登録LL I = 1 ; I <= N; ++ I){ 
        DP [ 1 ] [I] = valの[ 1 ] [i]は、
    } 
    ため(登録LL I = 2 ; iが= Kを<; ++ I){
        解決(I、I、N、I - 1、N- 1 )。
    } 
    のprintf(" %LLDする\ n "、和[N] - DP [K] [N])。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/czy-power/p/11371464.html