1014 Waiting in Line (30 分)
 

Suppose a bank has N windows open for service. There is a yellow line in front of the windows which devides the waiting area into two parts. The rules for the customers to wait in line are:

  • The space inside the yellow line in front of each window is enough to contain a line with M customers. Hence when all the N lines are full, all the customers after (and including) the (st one will have to wait in a line behind the yellow line.
  • Each customer will choose the shortest line to wait in when crossing the yellow line. If there are two or more lines with the same length, the customer will always choose the window with the smallest number.
  • Customer​i​​ will take T​i​​ minutes to have his/her transaction processed.
  • The first N customers are assumed to be served at 8:00am.

Now given the processing time of each customer, you are supposed to tell the exact time at which a customer has his/her business done.

For example, suppose that a bank has 2 windows and each window may have 2 custmers waiting inside the yellow line. There are 5 customers waiting with transactions taking 1, 2, 6, 4 and 3 minutes, respectively. At 08:00 in the morning, customer​1​​ is served at window​1​​ while customer​2​​ is served at window​2​​. Customer​3​​ will wait in front of window​1​​ and customer​4​​ will wait in front of window​2​​. Customer​5​​ will wait behind the yellow line.

At 08:01, customer​1​​ is done and customer​5​​ enters the line in front of window​1​​ since that line seems shorter now. Customer​2​​ will leave at 08:02, customer​4​​at 08:06, customer​3​​ at 08:07, and finally customer​5​​ at 08:10.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 4 positive integers: N (≤, number of windows), M (≤, the maximum capacity of each line inside the yellow line), K (≤, number of customers), and Q (≤, number of customer queries).

The next line contains K positive integers, which are the processing time of the K customers.

The last line contains Q positive integers, which represent the customers who are asking about the time they can have their transactions done. The customers are numbered from 1 to K.

Output Specification:

For each of the Q customers, print in one line the time at which his/her transaction is finished, in the format HH:MM where HH is in [08, 17] and MM is in [00, 59]. Note that since the bank is closed everyday after 17:00, for those customers who cannot be served before 17:00, you must output Sorry instead.

Sample Input:

2 2 7 5
1 2 6 4 3 534 2
3 4 5 6 7

Sample Output:

08:07
08:06
08:10
17:00
Sorry

题意分析:

(1)本题模拟银行排队,逻辑上不难,操作起来有点麻烦。银行来了K个客户,银行有N个窗口,每个窗口前有M个位置排队,客户选择最短的队伍排,根据每个客户的序号和服务时间来确定最后客户离开银行的时间。

(2)属于队列的问题,但实际上可以将问题简化:因为每个客户的服务时间是固定的,假设前N*M个客户达到之后排好位置后,他们的离开时间也就确定好了,即每个窗口本次服务结束的时间也就确定了,比如第一个人的服务时间是5min,则本次窗口的服务结束时间点是8:05,这样我们就可以比较这N个窗口当前服务结束的时间点,谁最早结束,谁的队伍最短,在线外等候的第N*M+1个客户选择这个队伍排,以此类推。

(3)每个客户离开的时间等于他前面一个人的离开时间加上他自己的服务时间,于是定义每个队列中的值是前一个值加上这个人的服务时间

(4)为了计算方便,将时间的基点设为0,算出的结果是在银行停留的时间(以分钟计算),最后再换算成小时+8

可能坑点:

(1)这是个大深坑,必须要保证当一个人等待时间大于或等于540分钟的时候,就不能服务了,而不是等待时间加上他的服务时间,言外之意就是,一旦这个人在540分钟之内获得服务,那么无论这个人的服务时间有多长,也要为他服务完,这也是符合实际的。

#include<bits/stdc++.h>
using namespace std;
queue<int>q[];
int a[];//服务时间
int ct[];//还需多少时间
int t[];//服务结束的时间
int N,M,K,Q;
void clear(queue<int> &q)
{
queue<int> empty;
swap(empty, q);
}
int main(){
cin>>N>>M>>K>>Q;
for(int i=;i<=N+;i++){
clear(q[i]);
}
for(int i=;i<=K;i++)
{
cin>>a[i];
ct[i]=a[i];
t[i]=;
}
//先把他们再队伍里放好
int p=min(N*M,K);
for(int i=;i<=p;i++)//这里出现了错误,后来知道要选择最小的
{
int x=i%N;
if(x==) x=N;
q[x].push(i);
}
if(K>=N*M+)
{
for(int i=N*M+;i<=K;i++){
q[N+].push(i);
}
}
//先标记最前面一排的人的时间
int T=;
while()
{
//每次挑出队列最前面的人群中的最少时间
int min_t=;
int is_all_empty=;
for(int i=;i<=N;i++)
{
if(!q[i].empty())
{
min_t=min(min_t,ct[q[i].front()]);
is_all_empty=;
}
}
if(is_all_empty==){
break;
}
T+=min_t;//从开始到现在过去了T分钟 //那么每个人减去这个时间,并把下一个人排进队伍
for(int i=;i<=N;i++)
{
//cout<<"遍历第"<<i<<"个窗口"<<endl;
if(!q[i].empty())//要先判断,否则会有段错误,这里错过一次
{ ct[q[i].front()]-=min_t;
if(ct[q[i].front()]==){
//cout<<i<<"窗口完成 "<<q[i].front()<<" 时间为"<<T<<endl;
//完成了
t[q[i].front()]=T; //设置他们结束的时间
q[i].pop();
//新的人可以入队啦
if(!q[N+].empty())
{
int x = q[N+].front();
q[N+].pop();
q[i].push(x);
//cout<<x<<"加入到 "<<i<<" 窗口"<<endl;
}
}
}
}
//大坑!!!特殊处理
if(T>=){
//仍要坚持把当前再服务的人服务完
for(int i=;i<=N;i++)
{
if(!q[i].empty())
{
int x=q[i].front();
if(ct[x]!=a[x])//处理到一半的继续处理
{
t[x]=T+ct[x];
}
}
}
break;
}
}
//输出时间
for(int i=;i<=Q;i++)
{
int x;
cin>>x;
if(t[x]==)
{
cout<<"Sorry"<<endl;
}
else
{
int h=t[x]/;
int m=t[x]-h*;
h+=;
if(h<)
{
cout<<'';
}
cout<<h<<":";
if(m<)
{
cout<<'';
}
cout<<m<<endl;
} }
return ;
}
 

PAT 甲级 1014 Waiting in Line (30 分)(queue的使用,模拟题,有个大坑)的更多相关文章

  1. PAT甲级1014. Waiting in Line

    PAT甲级1014. Waiting in Line 题意: 假设银行有N个窗口可以开放服务.窗前有一条黄线,将等候区分为两部分.客户要排队的规则是: 每个窗口前面的黄线内的空间足以包含与M个客户的一 ...

  2. 1014 Waiting in Line (30分)

    1014 Waiting in Line (30分)   Suppose a bank has N windows open for service. There is a yellow line i ...

  3. 【PAT甲级】1014 Waiting in Line (30 分)(队列维护)

    题面: 输入四个正整数N,M,K,Q(N<=20,M<=10,K,Q<=1000),N为银行窗口数量,M为黄线内最大人数,K为需要服务的人数,Q为查询次数.输入K个正整数,分别代表每 ...

  4. PAT 1014 Waiting in Line (30分) 一个简单的思路

    这题写了有一点时间,最开始想着优化一下时间,用优先队列去做,但是发现有锅,因为忽略了队的长度. 然后思考过后,觉得用时间线来模拟最好做,先把窗口前的队列填满,这样保证了队列的长度是统一的,这样的话如果 ...

  5. PAT A 1014. Waiting in Line (30)【队列模拟】

    题目:https://www.patest.cn/contests/pat-a-practise/1014 思路: 直接模拟类的题. 线内的各个窗口各为一个队,线外的为一个,按时间模拟出队.入队. 注 ...

  6. 1014 Waiting in Line (30 分)

    Suppose a bank has N windows open for service. There is a yellow line in front of the windows which ...

  7. PTA 1014 Waiting in Line (30分) 解题思路及满分代码

    题目 Suppose a bank has N windows open for service. There is a yellow line in front of the windows whi ...

  8. 【PAT Advanced Level】1014. Waiting in Line (30)

    简单模拟题,注意读懂题意就行 #include <iostream> #include <queue> using namespace std; #define CUSTOME ...

  9. PAT甲级——1131 Subway Map (30 分)

    可以转到我的CSDN查看同样的文章https://blog.csdn.net/weixin_44385565/article/details/89003683 1131 Subway Map (30  ...

随机推荐

  1. (13)input输入函数

    (1)input 等待用户动态输入一个值,注意得到的值是一个字符串类型 提示用户输入用户名和密码: 如果用户名是admin , 并且密码是000 , 提示用户恭喜你,登陆成功 否则提示用户名或密码错误 ...

  2. BCB 编写服务程序的一个注意事项

      BCB编写服务,install报错的一个问题 今天编写了一个服务,最后INSTALL 的时候报错,如图: 经过近1小时的比较(俺过去写例子),居然无意中设置了一个属性               ...

  3. 日志分析方法概述 & Web日志挖掘分析的方法

    日志在计算机系统中是一个非常广泛的概念,任何程序都有可能输出日志:操作系统内核.各种应用服务器等等.日志的内容.规模和用途也各不相同,很难一概而论. 本文讨论的日志处理方法中的日志,仅指Web日志.其 ...

  4. halcon导出类---HDevWindowStack详解

    在HDevelop中编写好的程序在导出时,Halcon会帮我们转换成我们需要的语言,比如C++.例:HDevelop中有如下语句需要导出: dev_close_window() Halcon导出成C+ ...

  5. python中的数据类型(二)

    一.列表(list) 列表是可变的,有序的(只要能索引的都是有序的) 列表的基本操作: 1.增 1.append   追加       例:lst.append(8)        print (ls ...

  6. jaxb读有BOM的XML文件问题

    一开始找了半天没找到什么原因,读文件就报错: Content is not allowed in prolog 后来发现是文件是UTF-8带BOM和不带BOM的问题 问题就好解决了,直接读带BOM文件 ...

  7. rect dict tect 词根助记

    rect: r (跑)e(E 槽子)ct(不停的跑)  就是直的 dict:  d(椅子)i(人)C(开口说)t(T 桌子)  : 椅子前站人 开口说前面是桌子 tect: tt(TT像盖子)EC(E ...

  8. 【基础算法-ST表】入门 -C++

    前言 学了树状数组看到ST表模板跃跃欲试的时候发现完全没思路,因为给出的查询的时间实在太短了!几乎是需要完成O(1)查询.所以ST表到底是什么神仙算法能够做到这么快的查询? ST表 ST表是一个用来解 ...

  9. learning express step(十一)

    learning express.Router() code: const express = require('express'); const app = express(); var route ...

  10. 使用devstack安装openstack

    使用devstack安装openstack 环境介绍,宿主机器 Fedora release 29 (Twenty Nine) 40核心cpu,32g内存 设想, 在fedora中安装kvm,虚拟出U ...