最优流水作业调度
求最短时间描述: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
[cpp]
#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;
}
求顺序
[cpp]
#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++ ,
上一个:旱冰场造价 对象的初次使用
下一个:TC SRM 573
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊