PAT 1014
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 (NM+1)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, customer1 is served at window1 while customer2 is served at window2. Customer3 will wait in front of window1 and customer4 will wait in front of window2. Customer5 will wait behind the yellow line.
At 08:01, customer1 is done and customer5 enters the line in front of window1 since that line seems shorter now. Customer2 will leave at 08:02, customer4 at 08:06, customer3 at 08:07, and finally customer5 at 08:10.
Input
Each input file contains one test case. Each case starts with a line containing 4 positive integers: N (<=20, number of windows), M (<=10, the maximum capacity of each line inside the yellow line), K (<=1000, number of customers), and Q (<=1000, 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
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
最大的坑是:对于那些在17:00之前已经开始处理的客户必须将他们的事务处理完。
代码
1 #include <stdio.h>
2 #include <string.h>
3
4 typedef struct Queue{
5 int q[];
6 int s,e;
7 }Queue;
8 void print(int);
9 void initQueue(Queue *);
10 int isEmpty(Queue *);
11 int isFull(Queue *);
12 int enterQueue(Queue *,int);
13 int outQueue(Queue *);
14 int readQueueBase(Queue *);
15
16 int processTime[],remindedTime[],queries[];
17 int finishedTime[];
18 Queue queue[];
19 const int totalTime = ;
20 int main()
21 {
22 int N,M,K,Q;
23 int i,j;
24 while(scanf("%d%d%d%d",&N,&M,&K,&Q) != EOF){
25 for(i=;i<=K;++i){
26 scanf("%d",&processTime[i]);
27 remindedTime[i] = processTime[i];
28 }
29 for(i=;i<Q;++i)
30 scanf("%d",&queries[i]);
31 memset(finishedTime,,sizeof(finishedTime));
32 for(i=;i<N;++i)
33 initQueue(&queue[i]);
34 int yellowLineNum = ;
35 for(i=;i<M;++i){
36 for(j=;j<N;++j){
37 if(yellowLineNum <= K){
38 enterQueue(&queue[j],yellowLineNum);
39 ++yellowLineNum;
40 }
41 else
42 break;
43 }
44 if(yellowLineNum > K)
45 break;
46 }
47 int nowTime = ;
48 int x;
49 for(;nowTime <= totalTime;++nowTime){
50 for(i=;i<N;++i){
51 if(!isEmpty(&queue[i])){
52 x = readQueueBase(&queue[i]);
53 --remindedTime[x];
54 if(remindedTime[x] == ){
55 finishedTime[x] = nowTime;
56 outQueue(&queue[i]);
57 if(yellowLineNum <= K){
58 enterQueue(&queue[i],yellowLineNum);
59 ++yellowLineNum;
60 }
61 }
62 }
63 }
64 }
65 for(i=;i<N;++i){
66 if(!isEmpty(&queue[i])){
67 x = readQueueBase(&queue[i]);
68 if(remindedTime[x] < processTime[x])
69 finishedTime[x] = totalTime + remindedTime[x];
70 }
71 }
72 for(i=;i<Q;++i){
73 if(finishedTime[queries[i]])
74 print(finishedTime[queries[i]]);
75 else
76 printf("Sorry\n");
77 }
78 }
79 return ;
80 }
81
82 void print(int t)
83 {
84 int h = t / ;
85 int s = t % ;
86 printf("%02d:%02d\n",h+,s);
87 }
88
89 void initQueue(Queue *Q)
90 {
91 (*Q).s = (*Q).e = ;
92 }
93
94 int isEmpty(Queue *Q)
95 {
96 return ((*Q).s) == ((*Q).e);
97 }
98
99 int isFull(Queue *Q)
{
return ((*Q).e + ) % == ((*Q).s);
}
int enterQueue(Queue *Q,int x)
{
(*Q).q[(*Q).e] = x;
(*Q).e = ((*Q).e + ) % ;
return ;
}
int outQueue(Queue *Q)
{
int x = (*Q).q[(*Q).s];
(*Q).s = ((*Q).s + ) % ;
return x;
}
int readQueueBase(Queue *Q)
{
return (*Q).q[(*Q).s];
}
PAT 1014的更多相关文章
- PAT 1014 福尔摩斯的约会 (20)(代码+思路)
1014 福尔摩斯的约会 (20)(20 分) 大侦探福尔摩斯接到一张奇怪的字条:"我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfd ...
- PAT——1014. 福尔摩斯的约会
大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”.大侦探很快就明白了,字条 ...
- PAT 1014 Waiting in Line (模拟)
1014. Waiting in Line (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...
- PAT 1014. 福尔摩斯的约会 (20)
大侦探福尔摩斯接到一张奇怪的字条:"我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm".大侦 ...
- PAT 1014. Waiting in Line
Suppose a bank has N windows open for service. There is a yellow line in front of the windows which ...
- pat 1014 1017 排队类问题
1.用循环模拟时间 2.采用结构体模拟客户和窗口对象 3.合理处理边界,去除无用信息 4.使用自带排序sort()结合自定义功能函数compare()实现排序
- PAT 1014 福尔摩斯的约会
https://pintia.cn/problem-sets/994805260223102976/problems/994805308755394560 大侦探福尔摩斯接到一张奇怪的字条:“我们约会 ...
- PAT 1014 Waiting in Line (模拟)
Suppose a bank has N windows open for service. There is a yellow line in front of the windows which ...
- PAT 1014 Waiting in Line (30分) 一个简单的思路
这题写了有一点时间,最开始想着优化一下时间,用优先队列去做,但是发现有锅,因为忽略了队的长度. 然后思考过后,觉得用时间线来模拟最好做,先把窗口前的队列填满,这样保证了队列的长度是统一的,这样的话如果 ...
随机推荐
- Java [Leetcode 283]Move Zeroes
题目描述: Given an array nums, write a function to move all 0's to the end of it while maintaining the r ...
- AngularJS 拦截器和好棒例子
目录[-] 什么是拦截器? 异步操作 例子 Session 注入(请求拦截器) 时间戳(请求和响应拦截器) 请求恢复 (请求异常拦截) Session 恢复 (响应异常拦截器) 总结 Intercep ...
- postInvalidate、removeAllViewsInLayout、refreshDrawableState用法
postInvalidate.invalidate:会调用控件的onDraw()重绘控件 refreshDrawableState:当控件在使用一个对控件状态敏感的Drawable对象时使用,如一个B ...
- [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.5.6
Let $A$ be a nilpotent operator. Show how to obtain, from aJordan basis for $A$, aJordan basis of $\ ...
- NBUT1457 Sona 莫队算法
由于10^9很大,所以先离散化一下,把给你的这一段数哈希 时间复杂度O(nlogn) 然后就是分块莫队 已知[L,R],由于事先的离散化,可以在O(1)的的时间更新[l+1,r],[l,r+1],[l ...
- 《Oracle Database 12c DBA指南》第一章 - 基本技能简介
当前关于12c的中文资料比较少,本人将关于DBA的一部分官方文档翻译为中文,很多地方为了帮助中国网友看懂文章,没有按照原文句式翻译,翻译不足之处难免,望多多指正. 1 基本技能简介 作为一个数据库管理 ...
- Python PIL创建文字图片
PIL库中包含了很多模块,恰当地利用这些模块可以做许多图像处理方面的工作. 下面是我用来生成字母或字符串测试图片而写的类及测试代码. 主要用到的模块: PIL.Image,PIL.ImageDraw, ...
- Hadoop文件系统常用命令
1.查看指定目录下内容 hadoop dfs –ls [文件目录] eg: hadoop dfs –ls /user/wangkai.pt 2.打开某个已存在文件 hadoop dfs –cat [f ...
- MFC定时器
比较简单,在程序中可以找到原型. 在程序中我们经常要使用定时刷新的功能,典型的应用是在信息管理系统中表单要跟着数据库中的数据变动.MFC提供了定时器来完成这个功能. ================= ...
- Windows下ffmpeg的完美编译
纠结了好几天,终于搞定了,小结一下. 1.下载ffmpeg源码,官网 2.编译环境Msys的安装配置,http://blog.csdn.net/jszj/article/details/4028716 ...