PTA A1014
A1014 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.
Customeri will take Ti 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. Customer 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 Specification:
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 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
单词
transaction
英 /træn'zækʃ(ə)n; trɑːn-; -'sæk-/ 美 /træn'zækʃən/
n. 交易;事务;办理;会报,学报
题目分析
这道题我差不多前前后后做了四遍,给了我一些教训,首先是30分题一定要提前规划好程序,解决这个问题我们需要哪些数据,说出来有点尴尬,一开始这题我甚至没有用队列,另外一定要仔细读题,是17:00之后来的客人不服务,17:00之前来的客人就算是到半夜也要服务完。另外是Sorry,不是sorry!
这题其实对我来说还是很有难度的,主要是不知道怎么把时间抽象出来,每一个窗口的每一个人服务时间都不同,用什么来保存,怎么保存每个人进入窗口的时间,很多问题。
这道题我最后用了两种方法A掉,一个是用一个int变量模拟时间,哪一个人进入窗口的时间加上服务时间等于现在时间就出队,然后再插入新的人,另一个是直接把人一个一个插入窗口,如果窗口都满了,那么把所有窗口中第一个服务好的哪个人出队列。两种方法的代码我都在下面贴出,思路参考了很多大佬,尤其是一个用65行C代码A掉这题的大佬。
具体代码
从时间角度
#include<stdio.h>
#include<stdlib.h>
#define MAXW 22
#define MAXQ 11
#define MAXP 1005
#define time intstruct Queue
{
int q[MAXQ];
int length;
int front;
int rear;
};struct Window
{
time endtime;
struct Queue queue;
};struct Person
{
time poptime;
time dealtime;
};struct Window window[MAXW];
struct Person person[MAXP];
int N, M, K, Q;
time nowtime = 0;void push_person(struct Queue *queue,int m)
{
queue->q[queue->rear] = m;
queue->rear = (queue->rear + 1) % (M + 1);
queue->length++;
}int pop_person(struct Queue *queue)
{
int tmp = queue->q[queue->front];
queue->front = (queue->front + 1) % (M + 1);
queue->length--;
return tmp;
}int find_min()
{
int tmp = -1;
int min = 999;
for (int i = 0; i从客户角度
#include<stdio.h>
#include<stdlib.h>
#define MAXW 22
#define MAXQ 11
#define MAXP 1005
#define time intstruct Queue
{
int q[MAXQ];
int length;
int front;
int rear;
};struct Window
{
time firsttime;
time endtime;
struct Queue queue;
};struct Person
{
time poptime;
time dealtime;
};struct Window window[MAXW];
struct Person person[MAXP];
int N, M, K, Q;void push_person(struct Queue *queue,int m)
{
queue->q[queue->rear] = m;
queue->rear = (queue->rear + 1) % (M + 1);
queue->length++;
}int pop_person(struct Queue *queue)
{
int tmp = queue->q[queue->front];
queue->front = (queue->front + 1) % (M + 1);
queue->length--;
return tmp;
}int find_min()
{
int push = 0;
for (int i = 0; i参考博客
1014 Waiting in Line (30 point(s)) - C语言 PAT 甲级
PTA A1014的更多相关文章
- 浙大PTA - - 堆中的路径
题目链接:https://pta.patest.cn/pta/test/1342/exam/4/question/21731 本题即考察最小堆的基本操作: #include "iostrea ...
- 浙大PTA - - File Transfer
题目链接:https://pta.patest.cn/pta/test/1342/exam/4/question/21732 #include "iostream" #includ ...
- ERROR<53761> - Plugins - conn=-1 op=-1 msgId=-1 - Connection Bind through PTA failed (91). Retrying...
LDAP6.3在DSCC控制台启动实例完成,但是操作状态显示“意外错误”,查看日志如下: 04/May/2016:21:10:39 +0800] - Sun-Java(tm)-System-Direc ...
- PTA中提交Java程序的一些套路
201708新版改版说明 PTA与2017年8月已升级成新版,域名改为https://pintia.cn/,官方建议使用Firefox与Chrome浏览器. 旧版 PTA 用户首次在新版系统登录时,请 ...
- PTA分享码-Java
主要用于Java语法练习,非竞赛类题目. 1. Java入门 959dbf0b7729daa61d379ec95fb8ddb0 2. Java基本语法 23bd8870e ...
- C语言第一次实验报告————PTA实验1.2.3内容
一.PTA实验作业 题目1.温度转换 本题要求编写程序,计算华氏温度100°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代 ...
- PTA题---求两个有序序列中位数所体现的思想。
---恢复内容开始--- 近日,在做PTA题目时,遇到了一个这样的题,困扰了很久.题目如下:已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A0,A1, ...
- 第十四,十五周PTA作业
1.第十四周part1 7-3 #include<stdio.h> int main() { int n; scanf("%d",&n); int a[n]; ...
- 第七周PTA作业
第一题: #include<stdio.h> int main() { ; ; ){ sum=sum+i; i++; } printf("sum = %d\n",sum ...
随机推荐
- 性能测试学习第一天-----概念、环境、LR录制&参数化
1.性能测试的概念: 通过一定的手段,在多并发情况下,获取被测系统的各项性能指标, 验证被测系统在高并发下的处理能力.响应能力.稳定性等,能否满足预期.定位性能瓶颈,排查性能隐患,保障系统的质量,提升 ...
- GSS4&&花仔游历各国
首先呢,我们想到一种数据结构可以区间开方,一看就不行,但是一看就算是10^18开六次方也只剩一,就不用开根了,所以可以想到用线段树或者分块水过,由于本人 不会用分块,只能用常数巨大的线段树 Code ...
- Appium+python自动化(三十五)- 命令启动appium之 appium服务命令行参数(超详解)
简介 前边介绍的都是通过按钮点击启动按钮来启动appium服务,有的小伙伴或者童鞋们乍一听可能不信,或者会问如何通过命令行启动appium服务呢?且听宏哥一一道来. 一睹为快 其实相当的简单,不看不知 ...
- Oracle面对“数据倾斜列使用绑定变量”场景的解决方案
1.背景知识介绍 2.构造测试用例 3.场景测试 4.总结 1.背景知识介绍 我们知道,Oracle在传统的OLTP(在线事务处理)类系统中,强烈推荐使用绑定变量,这样可以有效的减少硬解析从而 ...
- HDU 1079
题意略. 思路:dfs记忆化搜索即可. #include<bits/stdc++.h> using namespace std; ][][]; ][]; bool is_leap(int ...
- HackerRank - maximum-gcd-and-sum
题意:给你两个等长的数列,让你在两个数列中各选择一个数字,使得这两个数的gcd是这n * n种组合中最大的. 思路:如果上来就考虑分解因式什么的,就想偏了,假设数列1的最大数为max1,数列2的最大数 ...
- hihocoder #1616 : 是二叉搜索树吗?(模拟题)
题目链接:http://hihocoder.com/problemset/problem/1616 题解:就是简单的模拟一下至于如何判断是不是二叉搜索树可以通过中序遍历将每个点存下来看是不是递增的如果 ...
- codeforces 873 D. Merge Sort(分治)
题目链接:http://codeforces.com/contest/873/problem/D 题解:这题挺简单的,除了一开始算作是调用到一次,然后每次执行操作时都会调用2次,所以最多调用几次就很好 ...
- codeforces 456 E. Civilization(并查集+数的直径)
题目链接:http://codeforces.com/contest/456/problem/E 题意:给出N个点,M条边,组成无环图(树),给出Q个操作,操作有两种: 1 x,输出x所在的联通块的最 ...
- TLS加密远程连接Docker
<Docker远程连接设置>一文讲述了开启Docker远程连接的方法,但那种方法不安全,因为任何客户端都可以通过Docker服务的IP地址连接上去,今天我们就来学习Docker官方推荐的安 ...