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

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

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

输入格式:

输入第1行给出正整数N(≤),为顾客总人数;随后N行,每行给出一位顾客的到达时间T、事务处理时间P和是否VIP的标志(1是VIP,0则不是),并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤)—— 为开设的营业窗口数,以及VIP窗口的编号(从0到K−1)。这里假设每位顾客事务被处理的最长时间为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
调了整整一下午,真的恶心,注意看清加粗字体的要求,用队列模拟就行了,因为之前用结构体写过好几次队列了,这次就偷懒直接用STL里的了,代码如下(因为网上代码多是用时间流逝模拟,所以贴出我的代码以供交流学习,还望不要抄袭作业,毕竟可能会查重的:
 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue> using namespace std; #define INF 0x3f3f3f3f const int maxn = + ; struct people {
int T, P, VIP, counter_id;
}Customer[maxn]; int main()
{
int n;
scanf("%d", &n);
for(int i = ; i < n; ++i) {
scanf("%d %d %d", &Customer[i].T, &Customer[i].P, &Customer[i].VIP);
Customer[i].P = min(Customer[i].P, );
} int K, vipK;
scanf("%d %d", &K, &vipK); bool vis[maxn] = {}; queue<people> q; bool ok = true; for(int i = ; i < n; ++i) {
if(Customer[i].T > )
break;
if(Customer[i].VIP) {
ok = false;
Customer[i].counter_id = vipK;
vis[i] = ;
q.push(Customer[i]);
break;
}
} if(ok) {
Customer[].counter_id = ;
vis[] = ;
q.push(Customer[]);
} int sum = , _max = , last = , now = ;
int windows[] = {}, num_windows[] = {}; while(!q.empty()) {
_max = max(_max, windows[q.front().counter_id] - q.front().T);
sum += max(, windows[q.front().counter_id] - q.front().T);
windows[q.front().counter_id] = max(windows[q.front().counter_id], q.front().T) + q.front().P;
last = max(last, windows[q.front().counter_id]);
++num_windows[q.front().counter_id]; int minn = INF, idx = ; for(int i = ; i < K; ++i) {
if(windows[i] < minn) {
minn = windows[i];
idx = i;
}
} while(now < n && vis[now])
++now;
if(now == n)
break; ok = true; if(Customer[now].T <= windows[idx]) {
ok = true;
if(idx == vipK || windows[idx] == windows[vipK]) {
for(int i = now; i < n; ++i) {
if(!vis[i]) {
if(Customer[i].T > windows[idx]) {
break;
}
if(Customer[i].VIP) {
ok = false;
Customer[i].counter_id = vipK;
q.push(Customer[i]);
vis[i] = ;
break;
}
}
}
}
if(ok) {
Customer[now].counter_id = idx;
q.push(Customer[now]);
vis[now] = ;
}
}
else {
if(Customer[now].VIP && windows[vipK] <= Customer[now].T) {
Customer[now].counter_id = vipK;
q.push(Customer[now]);
vis[now] = ;
}
else {
for(int i = ; i < K; ++i) {
if(windows[i] <= Customer[now].T) {
Customer[now].counter_id = i;
q.push(Customer[now]);
vis[now] = ;
break;
}
}
}
}
q.pop();
} printf("%.1f %d %d\n", sum * 1.0 / n, _max, last); for(int i = ; i < K; ++i) {
printf("%d%c", num_windows[i], i == K - ? '\n' : ' ');
} return ;
}

PTA 银行排队问题之单队列多窗口加VIP服务 队列+模拟的更多相关文章

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

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

  2. PTA 银行排队问题之单队列多窗口服务 (25分)

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

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

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

  4. PTA 银行排队问题之单队列多窗口服务

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

  5. DS队列----银行单队列多窗口模拟

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

  6. 学习笔记TF049:TensorFlow 模型存储加载、队列线程、加载数据、自定义操作

    生成检查点文件(chekpoint file),扩展名.ckpt,tf.train.Saver对象调用Saver.save()生成.包含权重和其他程序定义变量,不包含图结构.另一程序使用,需要重新创建 ...

  7. 队列(Queue)\双端队列(Deque)

    队列(Queue)\双端队列(Deque) 队列(Queue) 双端队列(Deque) 算法应用 队列(Queue) 特点: 和栈不同,队列的最大特点是先进先出(FIFO),就好像按顺序排队一样.对于 ...

  8. RabbitMQ使用 prefetch_count优化队列的消费,使用死信队列和延迟队列实现消息的定时重试,golang版本

    RabbitMQ 的优化 channel prefetch Count 死信队列 什么是死信队列 使用场景 代码实现 延迟队列 什么是延迟队列 使用场景 实现延迟队列的方式 Queue TTL Mes ...

  9. 8月30号周五香港接单ING~~化妆品只加10元!!!!!!

    8月30号周五香港接单ING~~化妆品只加10元!!!!!! 8月30号周五香港接单ING~~化妆品只加10元!!!!!!

随机推荐

  1. LinkedList源码及原理

    简介 内部结构分析 LinkedList源码分析 构造方法 添加(add)方法 根据位置取数据的方法 根据对象得到索引的方法 检查链表是否包含某对象的方法: 删除(remove/pop)方法 Link ...

  2. (转)Linux Network IO Model、Socket IO Model - select、poll、epoll

    Linux Network IO Model.Socket IO Model - select.poll.epoll  原文:https://www.cnblogs.com/LittleHann/p/ ...

  3. SmartWeatherAPI C#版

    private string GetKey(string areaId, string type, string date, string appId, string privateKey) { va ...

  4. jQuery:如何给动态生成的元素绑定事件?

    jQuery的html()可以给现在元素附加新的元素,innerHTML也可以,那么,如何给这些新生成的元素绑定事件呢?直接在元素还未生成前就绑定肯定是无效的,因为所绑定的元素目前根本不存在. 然而, ...

  5. HTML5利用FormData对象实现显示进度条的文件上传

    摘自:https://blog.csdn.net/q1056843325/article/details/53759963 自己做是按这个实现的,兼容性还不错 完整简约的解决方案 下面的代码清单是包括 ...

  6. Java实现将GBK编码格式的文件夹中所有文件都转化为UTF-8格式的文件,编码格式转化

    package CodeConvert; import Java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fi ...

  7. Seven Deadly Sins: Gluttony, Greed, Sloth, Wrath, Pride, Lust, and Envy.

    Seven Deadly Sins: Gluttony, Greed, Sloth, Wrath, Pride, Lust, and Envy.七宗罪:暴食.贪婪.懒惰.暴怒.傲慢.色欲.妒忌.

  8. 关于IT公司招聘的一个思考

    作者:朱金灿 来源:http://blog.csdn.net/clever101 21世纪什么最贵?人才!相信这是很多IT公司管理者的深刻感悟.对于IT公司而言,找到合适的人才往往不能单靠人事部门,一 ...

  9. [Java]Eclipse无法import “com.sun.management.OperatingSystemMXBean”的解决方法

    背景: 当使用jdk的自带的API获取系统信息时,代码中import “com.sun.management.OperatingSystemMXBean”出现报错. 解决方法: Eclipse默认把这 ...

  10. 拷贝文件至U盘——提示:对于目标系统文件过大

    一.问题描述: 在制作U盘启动工具的时候,通常制作出的U盘文件系统是FAT32,但是当需要拷贝进去的系统文件大小超过4GB时,就会提示上述问题 二.解决办法: 1.格式化U盘,在格式化界面“文件系统” ...