P1248 加工生产调度

题目描述

某工厂收到了 n 个产品的订单,这 n 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。

某个产品 i 在 A、B 两车间加工的时间分别为Ai​,Bi​。怎样安排这 n 个产品的加工顺序,才能使总的加工时间最短。

这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A、B 两车间加工完毕的时间。

输入格式

第一行仅—个整数 n,表示产品的数量。

接下来一行 n 个整数是表示这 n 个产品在 A 车间加工各自所要的时间。

最后的 n 个整数是表示这 n 个产品在 B 车间加工各自所要的时间。

输出格式

第一行一个整数,表示最少的加工时间。

第二行是一种最小加工时间的加工顺序。

输入输出样例

输入 #1

5
3 5 8 7 10
6 2 1 4 9

输出 #1

34
1 5 4 2 3

A机器上加工时间短的任务应优先,而在B机器上加工时间短的任务应该排在后面。

/*
 * @Description: To iterate is human, to recurse divine.
 * @Autor: Recursion
 * @Date: 2022-03-17 11:02:14
 * @LastEditTime: 2022-03-17 11:41:28
 */
#include<bits/stdc++.h>
using namespace std;
int n,ans[10000],ti[10000],a[10000],b[10000];
struct node{
    int minn;
    int order;
};
node t[10000];
bool cmp(node x,node y)
{
    if(x.minn<y.minn)
        return true;
    else
        return false;
}

int main()
{
    while(cin>>n){
    memset(ans,0,sizeof(ans));
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(ti,0,sizeof(ti));
    for(int i=1;i<=n;i++){
        t[i].order=i;
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        cin>>b[i];
        t[i].minn=min(a[i],b[i]);
    }
    sort(t+1,t+1+n,cmp);
    int l=0,r=n+1;
    for(int i=1;i<=n;i++){//A时间短的往前面塞 
        if(t[i].minn==a[t[i].order]){
            l++;
            ans[l]=t[i].order;
        }
        else{
            r--;
            ans[r]=t[i].order;
        }
    }
    for(int i=1;i<=n;i++)
        ti[i]=ti[i-1]+a[ans[i]];
    int sum=ti[1]+b[ans[1]];
    for(int i=2;i<=n;i++)
        sum=max(ti[i],sum)+b[ans[i]];

    cout<<sum<<endl;
    // for(int i=1;i<=n;i++)
    //     cout<<ans[i]<<" ";
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值