洛谷P2224产品加工
[HNOI2001] 产品加工
题目描述
某加工厂有 A、B 两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成。由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工,所完成任务又会不同。
某一天,加工厂接到
你的任务就是:已知每个任务在 A 机器上加工所需的时间
输入格式
第一行为一个整数
接下来
输出格式
仅一行一个整数,表示完成所有
关于本题:
也是头一次见这种状态定义方式比较特殊的,我们发现对于任务排序不太好做,考虑dp,那么状态的设计呢
Sol:
(1).f[i][t1][t2]:表示前i个任务,A用时t1,B用时t2是否可行
我们发现maxt大约在6000*5=30000,空间时间都不允许,考虑降维
(2).f[i][t1]:表示前i个任务,A用时t1,B的最小用时,这一步是把B的状态取消固定
但是此时发现空间为 6000*30000=180000000=1.8 * 10^8,MLE
(3).转移时发现f[i]之和f[i-1]有关,滚动一下就行了
滚动后记得数组赋初始值,然后你就要用memset每次对f[last]这一行赋值了对吗?你会TLE得理所应当。
原因是多次调用memset使程序效率降低,那我们干脆就用临时变量算了,由于再滚动了一维,所以maxt要倒序枚举
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define min(x,y) ((x)<(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y))
const int N=3e5+7;
int n,ans=0x3f3f3f3f,s;
int x,y,z,maxt;
int f[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;++i){
cin>>x>>y>>z;
maxt+=max(max(x,y),z);
for(int j=maxt;j>=0;j--){
int tmp=0x3f3f3f3f;
if(x&&j>=x) tmp=min(tmp,f[j-x]);
if(y) tmp=min(tmp,f[j]+y);
if(z&&j>=z) tmp=min(tmp,f[j-z]+z);
f[j]=tmp;
}
}
for(int i=0;i<=maxt;++i)
ans=min(ans,max(i,f[i]));
cout<<ans<<'\n';
return 0;
}
样例 #1
样例输入 #1
5
2 1 0
0 5 0
2 4 1
0 0 3
2 1 1
样例输出 #1
9
提示
对于所有数据,有
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!