双机流水作业调度——codevs3008 加工生产调度

来源:互联网 发布:多条件计算不重复数据 编辑:程序博客网 时间:2024/05/21 14:54

http://codevs.cn/problem/3008/
额;
额;
我直接复制题解把;

这种题目是有个名词的,叫双机流水作业调度。
当然,poj上有这种题目,poj 2751,Saving Endeavour
值得庆幸的消息是,根据资料,已经证明,当机器数(或称工序数)大于等于3时,流水作业调度问题是一个NP-hard问题,
也就是说,出出题也就出个两台机器的问题。
同时值得庆幸的是,双机流水作业调度可用一个算法,Johnson算法。
(听说《算法设计与分析(第三版)》(王晓东 编著)有流水调度问题为什么可以采用Johnson算法的推导,说起来,谁能告诉我Johnson算法到底是个啥,除了这种,还能用于其他那些题目?)
具体过程……我语文不好,两篇相关文章看了,看不懂证明,只是知道了过程……
以样例数据为例:
(A1, A2, A3, A4, A5)=(3, 5, 8, 7, 10)
(B1, B2, B3, B4, B5)=(6, 2, 1, 4, 9)
则(m1, m2, m3, m4, m5)=(3, 2, 1, 4, 9)
排序之后为:(m3, m2, m1, m4, m5)
处理m3,因为m3=B3,所以m3安排在后面(,,,,3);
处理m2,因为m2=B2,所以m2安排在后面(,,,2,3);
处理m1,因为m1=A1,所以m1安排在前面(1,,,2,3);
处理m4,因为m4=B4,所以m4安排在后面(1,,4,2,3);
处理m5,因为m5=B5,所以m5安排在后面(1,5,4,2,3)。
从而得到加工的顺序1,5,4,2,3。计算出最短的加工时间34。
流水作业调度问题的定义,具体严谨的算法过程的描述和Pascal、C++实现参加下面的参考文章
参考文章:
http://wenku.baidu.com/view/9c31776727d3240c8447ef42.htm (有证明过程)
http://wenku.baidu.com/view/00ae21583b3567ec102d8aec.html(详细描述了Johnson算法)

#include<bits/stdc++.h>using namespace std;const int N=1e3+5;struct dian{int x,y,mi,ok,num;}d[N];int c[N],l,r;int n,m,ans,X,Y;bool cmp(dian a,dian b){if(a.mi!=b.mi)return a.mi<b.mi;}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)scanf("%d",&d[i].x);    for(int i=1;i<=n;i++)scanf("%d",&d[i].y);    for(int i=1;i<=n;i++){        d[i].mi=min(d[i].x,d[i].y);        if(d[i].mi==d[i].x)d[i].ok=1;        d[i].num=i;    }    sort(d+1,d+n+1,cmp);    l=0;r=n+1;    for(int i=1;i<=n;i++)        if(d[i].ok)c[++l]=i;else c[--r]=i;    for(int i=1;i<=n;i++){        X+=d[c[i]].x;        Y=max(X,Y);        Y+=d[c[i]].y;    }    printf("%d",max(X,Y));}
原创粉丝点击