|
楼主 |
发表于 2020-5-12 19:31:48
|
显示全部楼层
现有N个任务等处理,完成每个任务需要的时间分别为T1,T2,...(设为整数),处理任务的机器共有2台,要求将这些任务顺序分配给这两台机器处理,分配的原则是当前哪台机器处理任务的时间短就分配给哪台机器(如果当前两台机器处理完成任务的时间相同,则分配给第1台机器),要求按被处理完时间的先后顺序输出对应的任务号。
提示:设置两个队列,第一个队列存储分配给第一台机器的任务号,第二个队列存储分配给第二台机器的任务号。
函数initQueue完成队列初始化;queueEmpty判断队列是否为空;enQueue实现入队操作;deQueue实现出队操作;getHead获取队头元素;createJobs实现任务执行时间的输入,并将任务加入到相应的队列;dealJobs实现根据任务完成时间出队列,并输出任务编号
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 队列存储空间初始分配量 */
typedef int Status;
//构建任务数据类型
typedef struct {
int id;//任务编号
int starttime;//任务开始时间
int runtime;//任务运行时间
} QElemType;
/*循环队列的顺序存储结构
采用少用一个元素的方法实现,
即队列空间为 MAXSIZE,则有MAXSIZE-1个元素时则认为队列满。
*/
typedef struct {
QElemType data[MAXSIZE];
int front; /* 头指针 */
int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
} SqQueue;
Status initQueue(SqQueue &Q);
Status queueEmpty(SqQueue Q);
void enQueue(SqQueue &Q,QElemType e);
Status deQueue(SqQueue &Q,QElemType &e);
QElemType getHead(SqQueue Q);
void createJobs(SqQueue &A,SqQueue &B,int jobsNum);
void dealJobs(SqQueue &A,SqQueue &B);
int main(void) {
int jobsNum; //任务数目
SqQueue A,B;
initQueue(A);
initQueue(B);
scanf("%d", &jobsNum);
createJobs(A,B,jobsNum);
dealJobs(A,B);
return 0;
}
/* 初始化一个空队列Q,头尾指针初始设置 */
Status initQueue(SqQueue &Q) {
Q.front = 0;
Q.rear = 0;
return OK;
}
/* 若队列Q为空队列,则返回TRUE,否则返回FALSE */
Status queueEmpty(SqQueue Q) {
if(Q.front == Q.rear)
return TRUE;
return FALSE;
}
/*只提交以下代码*/
void enQueue(SqQueue &Q,QElemType e)
{
if ((Q.rear+1)%MAXSIZE==Q.front) exit(0);
Q.data[Q.rear]=e;
Q.rear++;
}
Status deQueue(SqQueue &Q,QElemType &e)
{
if (Q.front==Q.rear) exit(0);
e=Q.data[Q.front];
Q.front++;
}
QElemType getHead(SqQueue Q)
{
return Q.data[Q.front];
}
void createJobs(SqQueue &A,SqQueue &B,int jobsNum)
{
QElemType t;//e是结构体
int i,ta=0,tb=0;
for (i=1;i<=jobsNum;i++)
{
scanf ("%d",&t.starttime);
t.id=i;
if (ta<=tb)
{
enQueue(A,t);
ta=ta+t.starttime;
}
else if(ta>tb)
{
enQueue(B,t);
tb=tb+t.starttime;
}
}
}
void dealJobs(SqQueue &A,SqQueue &B)
{
QElemType a,b,e,t;
while (!queueEmpty(A)&&!queueEmpty(B))
{
if (a.starttime==0) a=getHead(A);
if (b.starttime==0) b=getHead(B);
if (a.starttime<b.starttime)
{
b.starttime=b.starttime-a.starttime;
printf ("%d ",a.id);
a.starttime=0;
deQueue(A,e);
}
else if(a.starttime==b.starttime)
{
printf ("%d %d ",a.id,b.id);
a.starttime=0; b.starttime=0;
deQueue(A,e); deQueue(B,e);
}
else if(a.starttime>b.starttime)
{
a.starttime=a.starttime-b.starttime;
printf ("%d ",b.id);
b.starttime=0;
deQueue(B,e);
}
} //whlie
while(!queueEmpty(A))
{
a=getHead(A);
printf ("%d ",a.id);
deQueue(A,e);
}
while(!queueEmpty(B))
{
b=getHead(B);
printf ("%d ",b.id);
deQueue(B,e);
}
}
|
|