加工生产调度 贪心算法 c++
题目描述
某工厂收到了 nn 个产品的订单,这 nn 个产品分别在 A,BA,B 两个车间加工,并且必须先在 AA 车间加工后才可以到 BB 车间加工。某个产品 ii 在 A,BA,B 两车间加工的时间分别为Ai,BiAi,Bi。怎样安排这 nn个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A,BA,B 两车间加工完毕的时间。
输入描述
多组输入,每组数据的第一行仅一个正整数 n(0<n<1000)n(0<n<1000) ,表示产品的数量。接下来 nn 个数据是表示这 nn 个产品在 AA 车间加工各自所要的时间 (都是整数)。最后的 nn 个数据是表示这 nn 个产品在 BB 车间加工各自所要的时间 (都是整数)。
输出描述
对于每组输入一个数据,表示最少的加工时间
样例输入(多组输入)
5
3 5 8 7 10
6 2 1 4 9
样例输出
34
解题思路:
1.贪心
2.因为必须要等待A加工结束才能加工B,所以为了使时间最短,应让A加工时间最短的排在最前,以使B加工的时候,A能同时加工下一件物品。
3.B加工时间最短的放在最后,因为B必须要等待A完工才能加工,放在最后能让等待时间最短。
代码概要:
1.排序:提取每个部件A和B中最小的数组成新数组并从小到大排序。从左往右,如果提取的是A则放到前面,B则放到后面
2.时间计算
先算A。因为B必须要等A完成之后才能进行下一个A,所以当B的时间小于A时,先将B时间同步至A然后在加B的时间
(关于这个可以画草图体会一下)
k = 0 ; t = 0;//k为A加工时间,t为B加工时间
for(i = 1; i <= n;i++){
k += a[ans[i]];
if(t < k) t = k;
t += b[ans[i]];
}
cout << t << endl;
完整代码:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define N 1005 using namespace std; int ans[N],n,k,i,j,t,a[N]; int b[N],m[N],s[N]; void solve(){ for(i = 1; i <= n;i++) { m[i] = min(a[i],b[i]); s[i] = i; } for(i = 1; i <= n-1;i++)//产品从小到大排序 for(j =i + 1; j<= n; j++) if(m[i] > m[j]) { swap(m[i],m[j]); swap(s[i],s[j]); } k = 0;t = n + 1; for(i = 1; i <= n;i++)//安排产品加工顺序 if(m[i] == a[s[i]]) { k++; ans[k] = s[i]; } else{ t--; ans[t] = s[i]; } k = 0 ; t = 0;//k为A加工时间,t为B加工时间 for(i = 1; i <= n;i++){ k += a[ans[i]]; if(t < k) t = k; t += b[ans[i]]; } cout << t << endl; } int main(){ while(cin >> n){ for(i = 1; i <= n; i++) cin >> a[i]; for(i = 1; i <= n; i++) cin >> b[i]; solve(); memset(ans, 0, sizeof(ans)); memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(m, 0, sizeof(m)); memset(s, 0, sizeof(s)); } return 0; }
参考原文:https://blog.csdn.net/zqhf123/article/details/106431238/
本代码为过OJ进行修改。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本