bzoj 1222
以前见过类似的题。
先按照某种策略求一个耗时,时间尽量少。
用 f[ j ] 表示当第一台机器工作了 j 个单位时间时,另一台机器工作时间的最小值。
设 a[ i ] 表示只第一台机器完成第 i 个任务需要的时间,b[ i ] 表示只第二台机器完成需要的时间,c[ i ]表示两台机器一起完成需要的时间。
f[ j ] = max( f[ j ] + b[ i ] , f[ j - a[ i ] ] , f[ j - c[ i ] ] + c[ i ] )。
#include"cstdio" #include"cctype" #include"algorithm" using namespace std; const int inf=40000; int read() { int c,x=0; while(!isdigit(c=getchar())); while(x=x*10+c-'0',isdigit(c=getchar())); return x; } int a[6001],b[6001],c[6001],f[30001]; int main() { int n=read(),v=0,ans=inf; for(int i=1;i<=n;i++) { a[i]=read(),b[i]=read(),c[i]=read(); if(a[i]==0) a[i]=inf; if(b[i]==0) b[i]=inf; if(c[i]==0) c[i]=inf; v+=min(min(a[i],b[i]),c[i]); } for(int i=1;i<=n;i++) for(int j=v;j>=0;j--) { f[j]+=b[i]; if(j>=a[i]) f[j]=min(f[j-a[i]],f[j]); if(j>=c[i]) f[j]=min(f[j-c[i]]+c[i],f[j]); } for(int i=0;i<=v;i++) ans=min(max(i,f[i]),ans); printf("%d",ans); return 0; }