[HNOI2001]产品加工
清新 题。
题目大意
有 个任务,第 个任务可以给 A 机器做,用时 ;给 B 机器做,用时 ;给 A 机器和 B 机器同时做,用时 。
求最小用时。
当对应 时,代表不能给这个机器或这两个机器做。
题目分析
令 表示完成了前 个任务,第一台机器耗时为 ,另一台耗时为 ,此时的最小总用时。
最终答案即为 。
先不论时间,即便用上滚动数组优化,空间复杂度也已经炸成花了,我们考虑一个巧妙的优化:
令 表示完成了前 个 任务,第一台机器耗时为 时第二台机器的最小耗时。
直接将 【第二台机器耗时】 这个东西干掉了!(
本题中状态转移方程并非重点,但还是摆上来:
仍然是可以滚动优化的。
时间复杂度 ,空间复杂度 。
是 的取值范围, 为 故 最大为 。
可以通过本题。
代码
//2022/1/8
const int INF=0x3f3f3f3f;
const int ma1=6005,ma2=30005;
int t1[ma1],t2[ma1],t3[ma1];
int dp[2][ma2];
int n;
int main(void)
{
n=read();
mst(dp,0x3f);
dp[0][0]=0;
for(register int i=1;i<=n;i++)
{
t1[i]=read(),t2[i]=read(),t3[i]=read();
}
int sum(0);
for(register int i=1;i<=n;i++)
{
mst(dp[i&1],0x3f);
sum+=max({t1[i],t2[i],t3[i]});
for(register int j=0;j<=sum;j++)
{
if(t2[i]!=0)
{
dp[i&1][j]=min(dp[i&1][j],dp[i&1^1][j]+t2[i]);
}
if(t1[i]!=0 && j>=t1[i])
{
dp[i&1][j]=min(dp[i&1][j],dp[i&1^1][j-t1[i]]);
}
if(t3[i]!=0 && j>=t3[i])
{
dp[i&1][j]=min(dp[i&1][j],dp[i&1^1][j-t3[i]]+t3[i]);
}
}
}
int ans=INF;
for(register int i=0;i<=sum;i++)
{
ans=min(ans,max(i,dp[n&1][i]));
}
printf("%d\n",ans);
return 0;
}
本文作者:Coros_Trusds
本文链接:https://www.cnblogs.com/Coros-Trusds/p/15778672.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步