[ZJOI2005]昼食[動的計画]

P2577 [ZJOI2005]ランチ

誰もが、両チームのラインアップに分け、時間のキューイングの人が早い終了時間のすべてを見つけるでしょう食べて過ごすために持っています

早くあなたが長い人を食べるために食事を考えることができますので、より多くの才能の多い順に並んで

F [k]は考えるようになった[I] [J]私は、時間窓の第2 jの早い終了時間を過ごすが、スペースが破裂する時間を費やすまでウィンドウ第1行の前に並んで待っている間にk個の個人を

そして、反射の一連の私は時間をキューイングすることによって、最も早い終了時間窓号2時間窓キューjをとり、個々の行番号[i]は-j星を合計する前に、F [i] [j]は時間を表し、

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define MAX(X、Y)(X)>(Y)?(X):( Y)
 #defineする MIN(X、Y)(X)>(Y)?(y)を:( X)
 の#define LL長いです長い
 の#define RGレジスタ
 のconst  int型 N = 200 + 5、M = 10000 + 5、INF = 0x3f3f3f3f、P = 99999997 int型 N、和[N]、F [N] [N * N]、ANS = INF。
テンプレート < クラス T> ボイド RD(T&X){ 
    X = 0int型のw = 0; CHAR CH = 0 しばらく W | = CH ==(isdigit(CH)!)' - '、CH = getchar関数();
    一方、(isdigit(CH))X =(X << 1)+(X << 3)+(CH ^ 48)、CH = GETCHAR()。
    X?= W - X:X; 
} 

構造体ノード{ INT [N] W};、B。
BOOL CMP(CONSTノードx、CONSTノードy){ 戻り XB> YB;} 

int型のmain(){ 
    freopenは(" in2.txt ""R " 、STDIN); 
    RD(n)は、合計[ 0 ] = 0 ;
     のためint型 I = 1 iは= N <; ++ I)のRDを(W [i]が.A)、RD(W [i]は.B)、
    ソート(W + 1、W + N + 1 、CMP)
     するためのint型 I = 1を iが<= N; I ++)和[I] =和[I- 1 ] + [I]のw .A; 
    のmemset(F、INF、はsizeof (F)); 
    F [ 0 ] [ 0 ] = 0 ;
     のためint型 i = 1 ; iは= N <; ++ I)
     のためにINT J = 0 ; jが<=和[I]; ++ J){
         場合(JW [I] .A> = 0)[I] [J] = MIN(最大、[I] [J] F F (F [I- 1 ] [JW [I] .A、W、jは+ [I] .B))。// 第iは排到1号窗口个人 
        [I] [J] = MIN(F [I] [J] F、MAX(F [I- 1 ] [j]は、和を[I] -j + W [i]は.B)); 
    } 
    のためにint型 i = 0 ; iが<=合計[N]; ++ I)ANS = MIN(ANS、F [n]は[I])。
    printf(" %dの" 、ANS)。
    リターン 0 ; 
}
 

 

おすすめ

転載: www.cnblogs.com/lxyyyy/p/11208206.html