流水作业调度问题
n个作业{0,1,2,…,n}在2台机器上M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,后在M2上加工。在两台机器上加工的时间分别为ai和bi。
解:
流水作业调度:
根据Johnson法则
使用结构体数组f1[j] 存放a[i]<b[i]的作业
使用结构体数组f2[k] 存放a[i]>=b[i]的作业
对f1[j]根据a[j]进行升序排列
对f2[k]根据b[k]进行降序排列。
遍历两个结构体数组,依次求时间
取两个机器运行时间的较大值作为作业用时。
#include <stdio.h>
#include <algorithm>
using namespace std;
struct node{
int a,b;
};
bool cmp1(node p,node q)
{
return p.a<q.a;
}
bool cmp2(node p,node q)
{
return p.b>q.b;
}
int main()
{
int a[100],b[100];
int n;
node f1[100];
node f2[100];
scanf("%d",&n);
int i,j,k;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
for(i=0,j=0,k=0;i<n;i++)
{
if(a[i]<b[i])
{//a[i]<b[i]放到f1[j]中
f1[j].a=a[i];
f1[j].b=b[i];
j++;
}else{//a[i]>=b[i]放到f2[k]中
f2[k].a=a[i];
f2[k].b=b[i];
k++;
}
}
sort(f1,f1+j,cmp1);//升序
sort(f2,f2+k,cmp2);//降序
int first=0;//机器a作业
int secend=0;//机器b作业
for(i=0;i<j;i++)
{
first+=f1[i].a;
secend=(first>secend?first:secend)+f1[i].b;//两个机器作业取大值
}
for(i=0;i<k;i++)
{
first+=f2[i].a;
secend=(first>secend?first:secend)+f2[i].b;
}
printf("%d\n",secend);
}