誰もが、両チームのラインアップに分け、時間のキューイングの人が早い終了時間のすべてを見つけるでしょう食べて過ごすために持っています
早くあなたが長い人を食べるために食事を考えることができますので、より多くの才能の多い順に並んで
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 = 0。int型の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 ; }