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;
}

 

posted @ 2018-02-26 14:33  312432424  阅读(92)  评论(0编辑  收藏  举报