流水作业调度(dp)

来源:互联网 发布:vb编写简单整人小程序 编辑:程序博客网 时间:2024/05/26 07:29

题目:

n个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi。

流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。


代码:

#include <bits/stdc++.h>using namespace std;const int MAXN=1010;struct node{    int min_cost,index;    bool flag;};node d[MAXN];bool cmp(node a,node b){    return a.min_cost<b.min_cost;}int main(){    int n,a[MAXN],b[MAXN],bq[MAXN];    cin>>n;    for(int i=1;i<=n;i++)    {        cin>>a[i]>>b[i];        d[i].min_cost=min(a[i],b[i]);        d[i].index=i;        d[i].flag=a[i]<b[i];    }    sort(d+1,d+1+n,cmp);    int head=1,tail=n;    for(int i=1;i<=n;i++)        if(d[i].flag) bq[head++]=d[i].index;        else bq[tail--]=d[i].index;    int k,t;    k=a[bq[1]];    t=k+b[bq[1]];    for(int i=2;i<=n;i++)    {        k+=a[bq[i]];        t=k<t?(t+b[bq[i]]):(k+b[bq[i]]);    }    for(int i=1;i<=n;i++) cout<<bq[i]<<" ";    cout<<endl<<t<<endl;    return 0;}

测试数据:

6
2 5
7 3
6 2
4 7
6 9
8 2
输出:
1 4 5 2 6 3
35

原创粉丝点击