流水作业调度

#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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值