f[i]表示第一台机器到第i分钟,第二台机器加工时间的最小值。
很怪的dp。。意会一下。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define N 6005
#define M 30005
#define INF 1000000001
using namespace std;
typedef long long ll;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
int n,m,ans=INF;
int a[N],b[N],c[N],f[M];
void Input_Init()
{
n=read();
for(int i=1;i<=n;i++)
{
if(!(a[i]=read())) a[i]=INF;
if(!(b[i]=read())) b[i]=INF;
if(!(c[i]=read())) c[i]=INF;
m+=min(a[i],min(b[i],c[i]));
}
}
void Solve()
{
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--)
{
int tmp=INF;
if(j-a[i]>=0) tmp=min(tmp,f[j-a[i]]);
tmp=min(tmp,f[j]+b[i]);
if(j-c[i]>=0) tmp=min(tmp,f[j-c[i]]+c[i]);
f[j]=tmp;
}
for(int i=0;i<=m;i++) ans=min(ans,max(i,f[i]));
printf("%d\n",ans);
}
int main()
{
Input_Init();
Solve();
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容