7-6 银行排队问题之单队列多窗口服务 (25分)
假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统计每个窗口服务了多少名顾客。
输入格式:
输入第1行给出正整数N(≤1000),为顾客总人数;随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤10),为开设的营业窗口数。这里假设每位顾客事务被处理的最长时间为60分钟。
输出格式:
在第一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。
在第二行中按编号递增顺序输出每个窗口服务了多少名顾客,数字之间用1个空格分隔,行末不能有多余空格。
输入样例:
9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3
输出样例:
6.2 17 61
5 3 1
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int cometime;
int starttime;
int waittime;
int spenttime;
int endtime;
struct node *next;
}LNode,*LinkList;
typedef struct queue{
LinkList head;
LinkList tail;
}LQueue;
void InitQueue(LQueue *q){
LNode *hhead=(LinkList)malloc(sizeof(LNode));
hhead->cometime=0;
hhead->starttime=0;
hhead->waittime=0;
hhead->spenttime=0;
hhead->endtime=0;
hhead->next=NULL;
q->head=hhead;
q->tail=hhead;
}
void InitNode(LNode *nd,int ct,int spendt){
LNode *newn=(LinkList)malloc(sizeof(LNode));
newn->next=NULL;
newn->cometime=ct;
newn->starttime=0;
newn->waittime=0;
newn->spenttime=spendt;
newn->endtime=0;
*nd=*newn;
}
void InsertQueue(LQueue *q,LNode *nd){
if(nd->cometime>q->tail->endtime){
nd->starttime=nd->cometime;
}
else
nd->starttime=q->tail->endtime;
nd->waittime=nd->starttime-nd->cometime;
nd->endtime=nd->starttime+nd->spenttime;
q->tail->next=nd;
nd->next=NULL;
q->tail=nd;
q->head->cometime++;
}
void printResult(LNode *es,int n,LQueue *qs,int k){
double avewait;
int maxwait=0,sumwait=0,lastend=0;
for(int i=0;i<n;i++){
sumwait+=es[i].waittime;
if(es[i].waittime>maxwait)
maxwait=es[i].waittime;
}
avewait=(double)sumwait/(double)n;
for(int i=0;i<k;i++){
if(qs[i].tail->endtime>lastend){
lastend=qs[i].tail->endtime;
}
}
printf("%.1lf %d %d\n",avewait,maxwait,lastend);
for(int i=0;i<k;i++){
if(i==0)
printf("%d",qs[i].head->cometime);
else
printf(" %d",qs[i].head->cometime);
}
}
int main()
{
int n,a,b,k;
scanf("%d",&n);
LNode es[n];
for(int i=0;i<n;i++){
scanf("%d %d",&a,&b);
if(b>60)
b=60;
InitNode(&es[i],a,b);
}
scanf("%d",&k);
LQueue qs[k];
for(int i=0;i<k;i++){
InitQueue(&qs[i]);
}
for(int i=0;i<n;i++){
int firsttime=qs[0].tail->endtime;
int insertq=0;
for(int j=0;j<k;j++){
if(qs[j].tail->endtime<es[i].cometime){
insertq=j;
break;
}
if(qs[j].tail->endtime<firsttime){
firsttime=qs[j].tail->endtime;
insertq=j;
}
}
InsertQueue(&(qs[insertq]),&(es[i]));
}
printResult(es,n,qs,k);
return 0;
}
因为是跟着学数据结构写的,所以就使用的是链式队列,一个个加入
但是很遗憾的是,测试点最后一个出错了,看了很多遍代码,还是没发现问题,希望有大佬能看出来帮帮本菜