加工生产调度 贪心算法 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进行修改。

 

 
posted @   Fordson  阅读(619)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示