#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define MAX 100
typedef struct
{
int a; //作业在机器m1上运行的时间
int b; //作业在机器m2上运行的时间
int index; //标识第几个作业
}job;
job Job[MAX];
job job1[MAX]; //存放a<b的作业
job job2[MAX]; //存放a>=b的作业
int cmp1(const void *job1, const void *job2) //非降序序排序
{
return (*(job *)job1).a >= (*(job *)job2).a;
}
int cmp2(const void *job1, const void *job2) //非升序序排序
{
return (*(job *)job1).b <= (*(job *)job2).b;
}
//n为作业数
//n个作业先在机器m1上运行,再在机器m2上运行,打印出n个作业运行所需最小时间
//并打印出作业调度顺序
void flowShow(int n)
{
int i;
int i1 = 0, i2 = 0;
for(i=0; i<n; i++)
{
if(Job[i].a<Job[i].b) //存放a<b的作业
{
job1[i1].a = Job[i].a;
job1[i1].b = Job[i].b;
job1[i1].index = Job[i].index;
i1++;
}
else //存放a>=b的作业
{
job2[i2].a = Job[i].a;
job2[i2].b = Job[i].b;
job2[i2].index = Job[i].index;
i2++;
}
}
qsort(job1, i1, sizeof(job), cmp1); //将job1中作业依a的非减序排序
qsort(job2, i2, sizeof(job), cmp2); //将job2中作业依b的非增序排序
int sum1 = job1[0].a;
int sum2 = sum1 + job1[0].b;
for(i=1; i<i1; i++)
{ //M1在执行job1[i]作业的同时,M2在执行job1[i-1]号作业,最短执行时间取决于M1与M2谁后执行完
sum1 += job1[i].a;
sum2 = sum2<sum1?sum1+job1[i].b:sum2+job1[i].b;
}
for(i=0; i<i2; i++)
{
sum1 += job2[i].a;
sum2 = sum2<sum1?sum1+job2[i].b:sum2+job2[i].b;
}
printf("最优调度下所需时间为:%d\n", sum2);
printf("最优调度为:\n");
for(i=0; i<i1; i++)
printf("作业%d(%d,%d)\n", job1[i].index, job1[i].a, job1[i].b);
for(i=0; i<i2; i++)
printf("作业%d(%d,%d)\n", job2[i].index, job2[i].a, job2[i].b);
}
int main()
{
int n;
printf("输入作业数:");
scanf("%d", &n);
int i;
printf("输入各作业在机器m1上运行时间:\n");
for(i=0; i<n; i++)
{
Job[i].index = i+1;
scanf("%d", &Job[i].a);
}
printf("输入各作业在机器m2上运行时间:\n");
for(i=0; i<n; i++)
{
scanf("%d", &Job[i].b);
}
flowShow(n);
return 0;
}
流水作业调度
最新推荐文章于 2023-12-21 11:25:51 发布