7-2 银行排队问题之单窗口“夹塞”版 (30分)

简介: 7-2 银行排队问题之单窗口“夹塞”版 (30分)

排队“夹塞”是引起大家强烈不满的行为,但是这种现象时常存在。在银行的单窗口排队问题中,假设银行只有1个窗口提供服务,所有顾客按到达时间排成一条长龙。当窗口空闲时,下一位顾客即去该窗口处理事务。此时如果已知第i位顾客与排在后面的第j位顾客是好朋友,并且愿意替朋友办理事务的话,那么第i位顾客的事务处理时间就是自己的事务加朋友的事务所耗时间的总和。在这种情况下,顾客的等待时间就可能被影响。假设所有人到达银行时,若没有空窗口,都会请求排在最前面的朋友帮忙(包括正在窗口接受服务的朋友);当有不止一位朋友请求某位顾客帮忙时,该顾客会根据自己朋友请求的顺序来依次处理事务。试编写程序模拟这种现象,并计算顾客的平均等待时间。


输入格式:

输入的第一行是两个整数:1≤N≤10000,为顾客总数;0≤M≤100,为彼此不相交的朋友圈子个数。若M非0,则此后M行,每行先给出正整数2≤L≤100,代表该圈子里朋友的总数,随后给出该朋友圈里的L位朋友的名字。名字由3个大写英文字母组成,名字间用1个空格分隔。最后N行给出N位顾客的姓名、到达时间T和事务处理时间P(以分钟为单位),之间用1个空格分隔。简单起见,这里假设顾客信息是按照到达时间先后顺序给出的(有并列时间的按照给出顺序排队),并且假设每个事务最多占用窗口服务60分钟(如果超过则按60分钟计算)。


输出格式:

按顾客接受服务的顺序输出顾客名字,每个名字占1行。最后一行输出所有顾客的平均等待时间,保留到小数点后1位。


输入样例:

6 2

3 ANN BOB JOE

2 JIM ZOE

JIM 0 20

BOB 0 15

ANN 0 30

AMY 0 2

ZOE 1 61

JOE 3 10


输出样例:

JIM

ZOE

BOB

ANN

JOE

AMY

75.2

#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
/*
 * 构建圈子
 * */
int cir1[10005];//每个圈子的人数
int cir11[10005];//打标记,
int cir22[10005] = {0};//打标记,就是看是否可以继续让下一个人用
string que1[10005];//输出的队列
string s1[105][105];//第一次的圈子,也就是原声圈子
string s2[105][105];//第二次输出的圈子,就是保存的结果
int cnt = 0,cnt1 = 0,cnt2 = 0;//备用计数器
int result = 0;//完成时间
double endTime = 0;
/*
 * 构建个人
 * */
struct Person{
    string name;
    int cir;//所在的圈子
    int arrive;
    int time;
}person[10005];
/*
 * 构建圈子的函数
 * */
void BuildCir(){
    int x;
    int count = 0;
    cin>>n>>m;
    for(int i = 0;i < m;i++){
        cin>>x;
        cir1[i] = x;//每个圈子有多少人
        for(int j = 0;j < x;j++){
            cin>>s1[i][j];//每个圈子里的具体的人数
        }
    }
}
/*
 * find 函数
 * */
int find(string name){
    for(int i = 0;i < m;i++){
        for(int j = 0;j < cir1[i];j++){ //cir1[i]表示这个圈子有多少人
            if(s1[i][j] == name){
                return i;
            }
        }
    }
    return -1;
}
int main(){
    BuildCir();//构建好圈子
    for(int i = 0;i < n;i++){
        cin>>person[i].name>>person[i].arrive>>person[i].time;
        if(person[i].time > 60)
            person[i].time = 60;
        person[i].cir = find(person[i].name);
    }//队列输入完毕
    int que[10005] = {0};//打标记,看看那个备选了  /*这个位置坑惨我了,天啊,一定要注意数据的范围啊*/
    for(int i = 0;i < n;i++){
        //cout<<person[i].name<<' '<<person[i].arrive<<' '<<person[i].time<<' '<<person[i].cir<<endl;
        if(person[i].cir != -1 && cir22[i] != 1 && que[i] == 0){  //是圈子里的人,但是圈子还没出现,并且人也没入队
            que1[cnt++] = person[i].name;//入队
            cir22[i] = 1;//圈子出现
            que[i] = 1;
            if(result >= person[i].arrive){//表示要排队等待
                endTime += result - person[i].arrive;
                //cout<<result <<'*'<< person[i].arrive<<endl;
                result += person[i].time;
                //cout<<endTime<<endl;
            }else {  //不需要排队等待
                result = person[i].arrive + person[i].time;
            }
            for(int j = i+1;j < n;j++){
                if(person[j].cir == person[i].cir){ //找同圈子里的人
                    if(person[j].arrive <= result){//这种情况下可以插队
                        endTime += result - person[j].arrive;
                        //cout<<result <<'*'<< person[j].arrive<<endl;
                        que1[cnt++] = person[j].name;
                        que[j] = 1;
                        result += person[j].time;
                        //cout<<endTime<<endl;
                    }else{//不能插队
                        cir22[i] = 0;//这个圈子拿出来重新排队
                        break;//不再继续往后找
                    }
                }
            }
        }else if(person[i].cir == -1){
            que1[cnt++] = person[i].name;//入队
            if(result >= person[i].arrive){//表示要排队等待
                endTime += result - person[i].arrive;
                //cout<<result <<'*'<< person[i].arrive<<endl;
                result += person[i].time;
                //cout<<endTime<<endl;
            }else {  //不需要排队等待
                result = person[i].arrive + person[i].time;
            }
        }
    }
    for(int i = 0;i < cnt;i++){
        cout<<que1[i]<<endl;
    }printf("%.1lf\n",endTime/n);
    return 0;
}
相关文章
|
4天前
|
存储 NoSQL JavaScript
排队免单融合链动模式:快速打开市场,加强复购
本文介绍了将“城市酷选”与“链动2+1”商业模式转化为技术实现的简化框架。涵盖后端开发(如技术栈选择、核心功能实现)、前端开发、数据库设计、安全性考虑及测试部署等方面,强调了奖励计算逻辑的正确性和效率,以及系统的合规性和可持续性。
考研真题)某银行提供了 1 个服务窗口和 10 个供顾客等待时使用的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用。当营业员空闲时,通过叫号选取一位顾
考研真题)某银行提供了 1 个服务窗口和 10 个供顾客等待时使用的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用。当营业员空闲时,通过叫号选取一位顾
|
存储 自然语言处理 算法
排队取快递这会我理清楚了各种编码集
排队取快递这会我理清楚了各种编码集
133 3
排队取快递这会我理清楚了各种编码集
|
算法 调度
调度算法 | 先来先服务(超市排队结账模型)
在操作系统中,如何去衡量性能?我们先简化模型,只用一个性能指标去衡量——周转时间,周转时间的定义是任务完成时间减去任务到达系统的时间
165 0
银行排队问题之单队列多窗口服务
银行排队问题之单队列多窗口服务
304 0
银行排队问题之单队列多窗口服务
L1-027 出租 (20 分)
L1-027 出租 (20 分)
108 0
L1-027 出租 (20 分)
|
C++
R7-3 出租 (20 分)
R7-3 出租 (20 分)
91 0
R7-3 出租 (20 分)
7-46 银行排队问题之单队列多窗口服务 (10 分)
7-46 银行排队问题之单队列多窗口服务 (10 分)
312 0
7-45 银行业务队列简单模拟 (10 分)
7-45 银行业务队列简单模拟 (10 分)
173 0
L1-7 出租 (20 分)
本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。
125 0
L1-7 出租 (20 分)