2020-10-11

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;
}

因为是跟着学数据结构写的,所以就使用的是链式队列,一个个加入
但是很遗憾的是,测试点最后一个出错了,看了很多遍代码,还是没发现问题,希望有大佬能看出来帮帮本菜
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值