流水做业调度

流水做业调度问题
描述:
N个做业{1,2,………,n}要在由两台机器M1和M2组成的流水线上完成加工。每一个做业加工的顺序都是先在M1上加工,而后在M2上加工。
M1和M2加工做业i所需的时间分别为ai和bi,1≤i≤n。流水做业高度问题要求肯定这n个做业的最优加工顺序,使得从第一个做业在
机器M1上开始加工,到最后一个做业在机器M2上加工完成所需的时间最少。
能够假定任何任务一旦开始加工,就不容许被中断,直到该任务被完成,即非优先调度。
输入:
输入包含若干个用例,第一行为一个正整数K(1<=K<=1000),表示用例个数,接下来K个用例,每一个用例第一个为做业数N(1<=N<=1000),
接下来N行,每行两个非负整数,分别表示在第一台机器和第二台机器上加工时间。
输出:
每一个用例用一行输出采用最优调度所用的总时间,即从第一台机器开始到第二台机器结束的时间。
样例输入:
1
4
5 6
12 2
4 14
8 7
样例输出:
33ios


算法描述:算法

1 令N1={i | ai < bi},N2={i | ai>=bi}spa

2 将n1中做业按ai的非减排序,n2 做业按bi非增排序code

3 构成知足Johnson法则的最优调度blog

#include <iostream> #include <algorithm>
using namespace std; class JOB { public: int key,index; bool job; }; bool cmp(JOB a,JOB b) { return a.key<b.key; } int func(int n,int a[],int b[],int c[]) { int i,j,k; JOB *d =new JOB[n]; for(i=0;i<n;i++) { if(a[i]<b[i]) { d[i].job =true; d[i].key =a[i]; } else { d[i].job=false; d[i].key=b[i]; } d[i].index=i; } sort(d,n+d,cmp); j=0,k=n-1; for(i=0;i<n;i++) { if(d[i].job ==true) c[j++]=d[i].index; else c[k--]=d[i].index; } j=a[c[0]]; k=j+b[c[0]]; for(i=1;i<n;i++) { j=j+a[c[i]]; k= j<k ? k+b[c[i]] : j+b[c[i]] ; } delete d; return k; } int main() { int i,n,m,a[100],b[100],c[100]; cin>>n; while(n--) { cin>>m; for(i=0;i<m;i++) { cin>>a[i]; cin>>b[i]; } cout<<func(m,a,b,c)<<endl; } return 0; }

运行结果:排序

相关文章
相关标签/搜索