题目大意:有一个加工厂里面有两个机器人,然后有一堆货物需要加工,这些货物加工必须按照顺序来,第n件物品能进行加工的前提条件是n-1件物品加工完成或正在加工。
图片说明

思路:

f[i][j]:第i个机器在加工时,A, B机器的要完成当前任务的时间差为j时。A, B机器的最大工作时长

图片说明

考虑转移: j>=0。A的工作时长>=B的工作时长。

如果第i+1个任务放在A塔上,只有A开始做第i+1个任务时,B机器才可能开始做第i+2个任务。那么时间差为A[i+1]。
那么f[i+1][a[i+1]]=min(f[i+1][a[i+1]], f[i][j]+a[i+1]);//放A塔

如果第i+1个任务放在B塔上,在B开始做第i+1个任务时,A塔的高度:f[i][j], B塔的高度:f[i][j]-j+B[i]。
那么:f[i+1][j-b[i+1]]=min(f[i+1][j-b[i+1]], max(f[i][j], f[i][j]-j+b[i+1]));//放B塔

j<0时,同样的方法分析。

include <bits/stdc++.h>

using namespace std;

int a[105], b[105], f[105][205];
int main() {

int T; scanf("%d", &T);
while(T--){
    int n; scanf("%d", &n);
    for(int i=1; i<=n; i++){
        scanf("%d%d", &a[i], &b[i]);
    }
    int pos=100;
    memset(f, 0x3f, sizeof(f));
    f[0][100]=0;
    for(int i=0; i<n; i++){
        for(int j=-100; j<=100; j++){
            if(j>=0){//A塔高
                f[i+1][pos+a[i+1]]=min(f[i+1][pos+a[i+1]], f[i][pos+j]+a[i+1]);//放A塔
                f[i+1][pos+j-b[i+1]]=min(f[i+1][pos+j-b[i+1]], max(f[i][pos+j], f[i][pos+j]-j+b[i+1]));//放B塔
            }
            else{//B塔高
                f[i+1][pos+j+a[i+1]]=min(f[i+1][pos+j+a[i+1]], max(f[i][pos+j], f[i][pos+j]+j+a[i+1]));//放A塔
                f[i+1][pos-b[i+1]]=min(f[i+1][pos-b[i+1]], f[i][pos+j]+b[i+1]);//放B塔
            }
        }
    }
    int mx=1<<30;
    for(int i=0; i<=200; i++){
        mx=min(mx, f[n][i]);
    }
    printf("%d\n", mx);
}

return 0;

}