排队“夹塞”是引起大家强烈不满的行为,但是这种现象时常存在。在银行的单窗口排队问题中,假设银行只有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

思路:

两个结构体数组,按题意模拟,代码比较复杂,一定要先用样例模拟一遍保证逻辑
注意点:
1.要设置顾客是否已经处理的判断条件
2.等待时间的计算一定要在窗口时间计算的前面

代码:

#include <stdio.h>
#include <string.h>
#define maxsize 100001
struct friends
{char fri[maxsize][4];
}circle[101]; // 朋友圈struct QueueData
{char name[4];int time;int pime;
}queue[maxsize];int s[maxsize];//判断顾客是否已经处理过,以处理用1表示
int len[101]; // 第几个圈子内有几个朋友
int main()
{int n, m;scanf("%d %d", &n, &m);//若圈子不为0, m为圈子数if(m){for(int i=0; i<m; i++){int l;scanf("%d", &l);len[i] = l;for(int j=0; j<l; j++){   //输入圈子中的名字scanf("%s", circle[i].fri[j]);}}}//输入所有顾客信息for(int i=0; i<n; i++){scanf("%s %d %d", queue[i].name, &queue[i].time, &queue[i].pime);if(queue[i].pime > 60) queue[i].pime = 60;}// 计算int sum_time = 0; //总共等待时间int win_time = 0; //窗口完成时间for(int i=0; i<n; i++){if(s[i] == 0) //不是圈子里的且没有被处理的顾客{if(queue[i].time >= win_time)//不需要等待{win_time += (queue[i].time - win_time) + queue[i].pime;}else //需要等待{sum_time += win_time - queue[i].time;win_time += queue[i].pime;}printf("%s\n", queue[i].name);int flag = 0;//是否有圈子int index = 0; //顾客所在的圈子位置// 先判断queue[i]顾客所属哪个圈子,再夹塞for(int j=0; j<m; j++){for(int k=0; k<len[j]; k++){if(strcmp(queue[i].name, circle[j].fri[k]) == 0){flag = 1;index = j;break;}}}// 属于圈子, 判断后面的顾客有没有跟他是同圈子的if(flag){for(int j=i+1; j<n; j++){for(int k=0; k<len[index]; k++){if(strcmp(queue[j].name, circle[index].fri[k])==0 && s[j]==0){if(queue[j].time > win_time) break; //夹塞顾客未在窗口完成时间内赶到// 提前或者准时到达,进行夹塞操作sum_time += win_time - queue[j].time;win_time += queue[j].pime;s[j] = 1;printf("%s\n", queue[j].name);//输出夹塞顾客}}}}}s[i] = 1;}// 输出平均等待时间 小数点后一位printf("%.1f", 1.0*sum_time/n);return 0;
}

7-4 银行排队问题之单窗口“夹塞”版 (30 分) C语言版相关推荐

  1. 7-48 银行排队问题之单窗口“夹塞”版 (30 分)(思路和详解+map做法)来呀Baby!

    一:题目 排队"夹塞"是引起大家强烈不满的行为,但是这种现象时常存在.在银行的单窗口排队问题中,假设银行只有1个窗口提供服务,所有顾客按到达时间排成一条长龙.当窗口空闲时,下一位顾 ...

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

    PTA 排队"夹塞"是引起大家强烈不满的行为,但是这种现象时常存在.在银行的单窗口排队问题中,假设银行只有1个窗口提供服务,所有顾客按到达时间排成一条长龙.当窗口空闲时,下一位顾客 ...

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

    7-4 银行排队问题之单队列多窗口加VIP服务 (30 分) 说实话这道题挺恶心 有意思的,大模拟,主要的思路就是模拟时间轴. 题目描述 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时 ...

  4. 7-3 银行排队问题之单队列多窗口服务 (25 分)

    7-3 银行排队问题之单队列多窗口服务 (25 分) 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可 ...

  5. 7-46 银行排队问题之单队列多窗口服务 (10 分)

    7-46 银行排队问题之单队列多窗口服务 (10 分) 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口 ...

  6. 题353.2022暑期天梯赛训练-7-10 银行排队问题之单队列多窗口服务 (25 分)

    文章目录 题353.2022暑期天梯赛训练-7-10 银行排队问题之单队列多窗口服务 (25 分) 题目: 输入格式: 输出格式: 输入样例: 输出样例: **思路** **代码** 题353.202 ...

  7. 单链表的基本操作代码实现(C语言版)

    目录 前言: 单链表的基本操作 准备工作(头文件.各种宏定义以及结构体定义) 一.较简单操作 1.单链表的初始化 2.判断单链表是否为空表 3.单链表的销毁 4.单链表的清空 5.求单链表的表长 二. ...

  8. 银行排队问题--事件链表+多窗口队列(数据结构课本)

    银行排队问题 事件驱动模拟问题 问题分析: ​ 银行开放了4个窗口,现在客户要从四面八方到银行办理业务:根据常识,到银行就少不了排队.我们排队按最短队伍排列,中途不切换队伍. ​ 现在随机生成到银行办 ...

  9. 易语言单窗口单ip软件源码_游戏工作室如何防封?游戏账号和IP被封的解决方法...

    现在的游戏公司,不管大的还是小的,多多少少都掌握了一些防封技术.把我们游戏打金者折腾的死去活来.关于游戏防封这方面的交流又很少,无奈!本方法除了部分不封号游戏外,还有个别疯狂封号必须让你立马死的游戏之 ...

最新文章

  1. Delphi使用资源文件全攻略
  2. C语言实现折半插入排序(Binary Insertion Sort)算法(附完整源码)
  3. StackOverflow 上面最流行的 7 个 Java 问题!| 值得一看
  4. 论文浅尝 | 基于知识库的类型实体和关系的联合抽取
  5. MATLAB中exist函数的用法
  6. Object_clone
  7. 仰望星空,脚踏实地 2016
  8. [buuctf.reverse] 33到50题
  9. 广义相对论和量子力学在哪些地方发生了严重的冲突(转)
  10. 防红域名生成的3种方法介绍
  11. css样式写一个公告通知
  12. 东方博宜OJ 1052 - 【入门】行李托运费
  13. 十月百度,阿里巴巴,迅雷搜狗最新面试七十题(第201-270题)
  14. java银行接口开发_银行接口开发,该如何解决
  15. matlab—— K均值聚类算法的步骤和实例
  16. 从BMC看出一个 idiot 的思维变化
  17. matlab中dir代表什么意思,matlab中 sizes.DirFeedthrough 什么意思
  18. Python一些可能用的到的函数系列102 推断df的变量类型
  19. 批量下载ECMWF数据的正确姿势
  20. SSM实现排课管理系统

热门文章

  1. 虚拟机与本机连接网络设置
  2. Struts2框架漏洞总结与复现(上) 含Struts2检测工具
  3. JDK源码中,都有哪些设计模式
  4. 搭建私有MAVEN仓库
  5. 蓝桥杯单片机学习13——NE555方波发生器频率测量
  6. P84-前端基础动画效果-动画3D复仇者联盟练习
  7. 摄像头在线测试_Leez学院| 面部检测 精准可靠 Leez P515 OpenCV工程测试
  8. 2.ZooKeeper分桶策略实现高性能的会话管理「第五章 ZooKeeper 原理」「架构之路ZooKeeper理论和实战」
  9. 自锁电路设计1.5V电压起
  10. Shell中获取脚本的绝对路径$( cd $( dirname ${BASH_SOURCE[0]} ) pwd)