程序填空题:用贪心法求多机调度问题(C语言描述)
设有n个独立的作业{1,2,…,n},由m台相同的机器{1,2, …,m}进行加工处理;作业 i 所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但未完工前不允许中断,任何作业也不能拆分成更小的子作业。
该多机调度问题要求给出一种贪心法作业调度方案,把n个作业按用时长从大到小顺序安排在最先空闲的机器上加工处理。
#include<stdio.h>
#include<stdlib.h>
#define N 100 //作业数上限
int n; //作业数
int m; //机器数
struct NodeType
{
int no; //作业序号
int t; //执行时间
int mno; //机器序号
};
struct NodeType A[N];
struct NodeType machine[N]; //机器最后一个作业,(结束时间)
int cmp(const void *a, const void *b) // 排序比较函数
{
return -(((struct NodeType *)a)->t - ((struct NodeType *)b)->t); // 从大到小
}
struct NodeType get_min(struct NodeType machine[])
{ // 选择最先空闲机器
struct NodeType e = machine[0];
int min = machine[0].t, index = 0, i;
for( i=1; i<m; i++)
if(machine[i].t < min) {
min = machine[i].t;
e = machine[i];
;
}
e.mno = index+1; // 最先空闲机器号
return e;
}
void solve() //求解多机调度问题
{
struct NodeType e;
int i,j;
if (n<=m)
return;
qsort(A, n, sizeof(struct NodeType), cmp); // 快速排序
for (i=0; i<m; i++)
{
A[i].mno=i+1;
printf("%d %d %d-%d\n",
A[i].mno, A[i].t, 0, A[i].t);
machine[i]=A[i];
}
for (j=m; j<n; j++)
{ e = ;
printf("%d %d %d-%d\n",
e.mno, A[j].t, e.t, e.t+A[j].t);
machine[e.mno-1].t ;
}
}
int main()
{ int i;
scanf("%d %d",&n, &m);
for(i=0; i<n; i++)
scanf("%d %d", &A[i].no, &A[i].t);
solve();
return 0;
}
输入格式:
第一行输入作业数n和机器数m,用一个空格分隔;接着的n行输入作业编号和处理时长(均为正整数,用空格分隔)。
输出格式:
按照处理的作业顺序输出n行,每行输出机器编号、处理时长、占用时间区间,用空格分隔。
输入样例:
in
5 2
1 2
2 5
3 4
4 2
5 3
输出样例:
out
1 5 0-5
2 4 0-4
2 3 4-7
1 2 5-7
1 2 7-9
答案:
第1空:index = i
第2空:get_min(machine)
第3空:+= A[j].t
该多机调度问题要求给出一种贪心法作业调度方案,把n个作业按用时长从大到小顺序安排在最先空闲的机器上加工处理。
#include<stdio.h>
#include<stdlib.h>
#define N 100 //作业数上限
int n; //作业数
int m; //机器数
struct NodeType
{
int no; //作业序号
int t; //执行时间
int mno; //机器序号
};
struct NodeType A[N];
struct NodeType machine[N]; //机器最后一个作业,(结束时间)
int cmp(const void *a, const void *b) // 排序比较函数
{
return -(((struct NodeType *)a)->t - ((struct NodeType *)b)->t); // 从大到小
}
struct NodeType get_min(struct NodeType machine[])
{ // 选择最先空闲机器
struct NodeType e = machine[0];
int min = machine[0].t, index = 0, i;
for( i=1; i<m; i++)
if(machine[i].t < min) {
min = machine[i].t;
e = machine[i];
;
}
e.mno = index+1; // 最先空闲机器号
return e;
}
void solve() //求解多机调度问题
{
struct NodeType e;
int i,j;
if (n<=m)
return;
qsort(A, n, sizeof(struct NodeType), cmp); // 快速排序
for (i=0; i<m; i++)
{
A[i].mno=i+1;
printf("%d %d %d-%d\n",
A[i].mno, A[i].t, 0, A[i].t);
machine[i]=A[i];
}
for (j=m; j<n; j++)
{ e = ;
printf("%d %d %d-%d\n",
e.mno, A[j].t, e.t, e.t+A[j].t);
machine[e.mno-1].t ;
}
}
int main()
{ int i;
scanf("%d %d",&n, &m);
for(i=0; i<n; i++)
scanf("%d %d", &A[i].no, &A[i].t);
solve();
return 0;
}
输入格式:
第一行输入作业数n和机器数m,用一个空格分隔;接着的n行输入作业编号和处理时长(均为正整数,用空格分隔)。
输出格式:
按照处理的作业顺序输出n行,每行输出机器编号、处理时长、占用时间区间,用空格分隔。
输入样例:
in
5 2
1 2
2 5
3 4
4 2
5 3
输出样例:
out
1 5 0-5
2 4 0-4
2 3 4-7
1 2 5-7
1 2 7-9
答案:
第1空:index = i
第2空:get_min(machine)
第3空:+= A[j].t