4 银行排队问题之单队列多窗口加VIP服务 (30分)----模拟

    xiaoxiao2021-03-25  101

    4 银行排队问题之单队列多窗口加VIP服务   (30分)

    假设银行有KK个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。

    有些银行会给VIP客户以各种优惠服务,例如专门开辟VIP窗口。为了最大限度地利用资源,VIP窗口的服务机制定义为:当队列中没有VIP客户时,该窗口为普通顾客服务;当该窗口空闲并且队列中有VIP客户在等待时,排在最前面的VIP客户享受该窗口的服务。同时,当轮到某VIP客户出列时,若VIP窗口非空,该客户可以选择空闲的普通窗口;否则一定选择VIP窗口。

    本题要求输出前来等待服务的NN位顾客的平均等待时间、最长等待时间、最后完成时间,并且统计每个窗口服务了多少名顾客。

    输入格式:

    输入第1行给出正整数NN\le 10001000),为顾客总人数;随后NN行,每行给出一位顾客的到达时间T、事务处理时间P和是否VIP的标志(1是VIP,0则不是),并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数KK\le 1010)—— 为开设的营业窗口数,以及VIP窗口的编号(从0到K-1K1)。这里假设每位顾客事务被处理的最长时间为60分钟。

    输出格式:

    在第一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。

    在第二行中按编号递增顺序输出每个窗口服务了多少名顾客,数字之间用1个空格分隔,行末不能有多余空格。

    输入样例:

    10 0 20 0 0 20 0 1 68 1 1 12 1 2 15 0 2 10 0 3 15 1 10 12 1 30 15 0 62 5 1 3 1

    输出样例:

    15.1 35 67 4 5 1

    题目链接:https://pta.patest.cn/pta/test/4169/exam/4/question/62124

    账号:sdut软件1501陈衍凯

    密码:5148275

    留作备用。

    不算是太麻烦的一个模拟,思路还算清晰,写起来脑子也还没有混乱。差不多写了一个小时,天梯赛中可不允许啊,哎,还是太菜了。

    不知道为什么,最后两组测试死活拿不到。

    丢了3分的代码:

    #include <cstdio> #include <cstring> #include <iostream> using namespace std; struct node{ int t,p,v; int wait; int flag; }xin[200000]; int num[2000]; int Time[2000]; int vis[2000]; int main(){ int n; scanf("%d",&n); int maxn=0; for(int i=0;i<=n;i++){ xin[i].wait=0; num[i]=0; xin[i].flag=0; Time[i]=0; vis[i]=0; } for(int i=1;i<=n;i++){ scanf("%d%d%d",&xin[i].t,&xin[i].p,&xin[i].v); if(xin[i].p>60) xin[i].p=60; maxn=max(maxn,xin[i].t+xin[i].p); } int k,m; int a[2000]; int left=0,right=0; scanf("%d%d",&k,&m); int sum=0; for(int i=0;i<=maxn;i++){ for(int j=1;j<=n;j++){ if(xin[j].t==i){ a[right++]=j; } else if(xin[j].t>i) break; } for(int j=0;j<k;j++){ if(Time[j]==i){ vis[j]=0; } } if(!vis[m]){ for(int j=left;j<right;j++){ if(xin[a[j]].v==1&&!xin[a[j]].flag){ xin[a[j]].flag=1; vis[m]=1; Time[m]=i+xin[a[j]].p; num[m]++; xin[a[j]].wait=i-xin[a[j]].t; break; } } } while(left<right){ int v=a[left]; if(xin[v].flag){ left++; continue; } int j; for(j=0;j<k;j++){ if(!vis[j]){ break; } } if(j==k) break; xin[v].wait=i-xin[v].t; vis[j]=1; num[j]++; Time[j]=i+xin[v].p; xin[v].flag=1; left++; } } int x=0; for(int i=1;i<=n;i++){ sum+=xin[i].wait; x=max(x,xin[i].wait); } printf("%.1lf %d %d\n",sum*1.0/n,x,maxn); for(int i=0;i<k;i++){ printf(i==0?"%d":" %d",num[i]); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-13349.html

    最新回复(0)