加工生产调度

23 篇文章 0 订阅

题目

https://www.luogu.org/problemnew/show/P1248

思路

n个作业要在由两台机器M1和M2组成的流水线上完成加工.每个作业i必须先在M1上然后在M2上加工,时间分别为ai和bi。

确定这n个作业的加工顺序,使得从第一个任务开始在M1上加工到最后一个任务在M2上加工完成的总时间尽量小。

直观上,最优调度一定让M1没有空闲,M2的空闲时间尽量少。

算法:
①使用数组f1[j] 存放a[i]<b[i]的作业;

②使用数组f2[k] 存放a[i]>=b[i]的作业;

③对f1[j]根据a[j]进行升序排列;

④对f2[k]根据b[k]进行降序排列;

⑤遍历两个数组,依次求时间:取两个机器运行时间的较大值作为作业用时。

代码

#include<bits/stdc++.h>
using namespace std;
struct NN
{
    int a,b,minn,pm;
};
NN T1[1005],T2[1005];
bool cmp(NN x,NN y){return x.minn<y.minn;}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>T1[i].a;
    for(int i=1;i<=n;i++)cin>>T1[i].b;
    for(int i=1;i<=n;i++){T1[i].minn=min(T1[i].a,T1[i].b);T1[i].pm=i;}
    sort(T1,T1+n+1,cmp);
    int l=1,r=n;
    for(int i=1;i<=n;i++)
    {
        if(T1[i].minn==T1[i].a){T2[l++]=T1[i];}
        else {T2[r--]=T1[i];}
    }
    int i=1,at=0,bt=0,t=T2[1].a;T2[n+1].a=0;
    while(i<=n)
    {
        bt+=T2[i].b;at=T2[++i].a;
        if(at<bt)
        {
            bt-=at;t+=at;at=0;
        } 
        else if(at>=bt)
        {
            t+=at;at=0;bt=0;
        }
    }t+=bt;
    cout<<t<<endl;
    for(int i=1;i<=n;i++)
        cout<<T2[i].pm<<' ';
        cout<<endl; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值