题目大意:有一个加工厂里面有两个机器人,然后有一堆货物需要加工,这些货物加工必须按照顺序来,第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;
}