最优流水作业调度

流水作业调度问题

下面代码我也没搞懂   尤其是求顺序 的 吓死了

直接留着当模板用吧

参考 http://blog.csdn.net/wshunter/article/details/6929775

http://blog.sina.com.cn/s/blog_777472f10100u5vl.html


求最短时间
描述:
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
样例 输出:

33

#include <iostream>
#include <algorithm>//用于下面的排序函数sort()库函数的调用
using namespace std;
class JOB
{
public:
	int key,index;
	bool job;
};
int cmp(JOB a,JOB b)
{
	return a.key<b.key;
}
//算法的最主要的部分
int fun(int n,int a[],int b[],int c[])
{
	int i,j,k;
	JOB *d =new JOB[n];//开辟一个空间大小为n的JOB,即有n个的JOB对象
	for(i=0;i<n;i++)
	{
		if(a[i]<b[i])
		{
			d[i].key = a[i];
			d[i].job = true;
		}
		else
		{
			d[i].key = b[i];
			d[i].job = false;
		}
		d[i].index = i;
	}
	sort(d,n+d,cmp);//对n个对象按key的大小进行排序
	j=0;
	k=n-1;
	//下面的for()对上面对key进行排好的序再按job为真的key升排序,job
	//为假降序排列,分别将它们的最先排的次序存到c[]数组中。
	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()就是将最短的时间输出
	for(i=1;i<n;i++)
	{
		j=j+a[c[i]];
		k= j<k ? k+b[c[i]] : j+b[c[i]];
		//前一个作业的时间与前一个作业的第一个时间和第二个作业的时间相
		//比,k为那个较大的
	}
	delete d;
	return k;
}
//如下是主函数主要是用例的输入和函数调用
int main()
{
	int i,m,n,a[100],b[100],c[100];
	cin>>m;
	while(m--)
	{
		cin>>n;
		for(i=0;i<n;i++)cin>>a[i]>>b[i];
		cout<<fun(n,a,b,c)<<endl;
	}
	return 0;
}



求顺序

#include <stdio.h>
#include <stdlib.h>

#define		MAX_LEN		128

void heap_adjust(int *array,int *index,int n,int loc)
{
	int tmp,i,j,k;
	tmp=array[loc];
	k=index[loc];
	for(i=loc;2*i<n;i=j)
	{
		j=2*i;
		if(j+1<n && array[j]<array[j+1]) j++;
		if(tmp < array[j]) {
			array[i]=array[j];
			index[i]=index[j];
		}
		else break;
	}
	array[i]=tmp;
	index[i]=k;
}

void heap_sort(int *array,int *index,int n)
{
	int i,j,tmp;
	for(i=n/2;i>0;i--)
		heap_adjust(array,index,n,i);

	for(i=n;i>1;i--)
	{
		tmp=array[i];
		array[i]=array[1];
		array[1]=tmp;
		
		j=index[i];
		index[i]=index[1];
		index[1]=j;

		heap_adjust(array,index,i,1);
	}
}


int main()
{
	int n,i,j,k;
	int A[MAX_LEN],B[MAX_LEN],C[MAX_LEN*2],D[MAX_LEN*2],E[MAX_LEN],F[MAX_LEN];
	while(1==scanf("%d",&n)){
		if(n > 0 && n < MAX_LEN){
			for(i=1;i<=n;i++)
				scanf("%d%d",A+i,B+i);
			break;
		}
		printf("invalid n\n");
	}

	//initial tabs
	for(i=1;i<=2*n;i++){
		if(i<=n){
			C[i]=A[i];
			D[i]=i;
			E[i]=0;
		}
		else{
			C[i]=B[i-n];
			D[i]=-(i-n);
		}
	}

	//sort it!
	heap_sort(C,D,2*n);

	//dp find
	for(k=1,i=1,j=n;i<=j;k++){
		if(D[k] > 0){
			if(E[D[k]] == 0){
				F[i++]=D[k];
				E[D[k]]=1;
			}
		}
		else{
			if(E[-D[k]] == 0){
				F[j--]=-D[k];
				E[-D[k]]=1;
			}
		}
	}


	printf("scheduled tasks:");
	for(i=1;i<=n;i++)
		printf("%-3d",F[i]);
	printf("\n");

	return 0;
}



OK
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值