流水线调度(51Nod-1205)

本文介绍了一种两机器流水线调度问题的解决方案,利用Johnson法则确定最优作业顺序,以实现从首个作业开始到最终作业完成的最短总时间。通过具体实例展示了算法的设计与实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

N个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为a[i]和b[i]。你可以安排每个作业的执行顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。求这个最少的时间。

输入

第1行:1个数N,表示作业的数量。(2 <= N <= 50000)
第2 - N + 1行:每行两个数,中间用空格分隔,表示在M1和M2上加工所需的时间a[i], b[i]。(1 <= a[i], b[i] <= 10000)。

输出

输出完成所有作业所需的最少时间。

输入样例

4
3 7
2 1
1 1
4 2

输出样例

14

思路:两机器的单车间调度问题,使用 Johnson 法则解决即可

源程序

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 100000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;
struct Node{
    int num;
    int id;
    bool operator < (const Node &rhs)const{
        return num<rhs.num;
    }
}m[N];
int a[N],b[N];
int res[N];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i],&b[i]);

    for(int i=1;i<=n;i++){
        m[i].num=min(a[i],b[i]);
        m[i].id=i;
    }

    sort(m+1,m+1+n);

    int head=0,tail=n+1;
    for(int i=1;i<=n;i++){
        int num=m[i].num;
        int id=m[i].id;
        if(num==a[id])
            res[++head]=id;
        else
            res[--tail]=id;
    }

    int timeA=0,timeB=0;
    for(int i=1;i<=n;i++){
        timeA+=a[res[i]];
        if(timeB<timeA)
            timeB=timeA;
        timeB+=b[res[i]];
    }

    printf("%d\n",timeB);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值