PAT_甲级_1017 Queueing at Bank (25分) (C++)【模拟+结构体排序】
原创
©著作权归作者所有:来自51CTO博客作者再见萤火虫IT的原创作品,请联系作者获取转载授权,否则将追究法律责任
目录
1,题目描述
题目大意
输入
输出
说明
2,思路
数据结构
关键点
3,代码
1,题目描述
Sample Input:
7 3
07:55:00 16
17:00:01 2
07:59:59 15
08:01:00 60
08:00:00 30
08:00:02 2
08:03:00 10
Sample Output:
题目大意
银行有K个窗口,黄线将人分成两部分:黄线内,正在接受服务;黄线外,排队等候。要求计算所有人的平均等待时间
输入
第一行:N:顾客总数(<=10^4),K:窗口数目(<=100)
其余:顾客的到达时间(HH:MM:SS),需求处理时间
输出
所有顾客的平均等待时间(保留一位小数)
说明
- 每个窗口的占用时间不超过1小时;
- 银行工作时间:08:00-17:00,早于8点的需等到8点,晚于17点的将不再提供服务且不计等待时间;
2,思路
将17点之前到达的顾客数据存储在容器中,容器的大小即接受服务的顾客数目。设置窗口数组,存放窗口的可用时间,在模拟排队时,可用此时间与顾客的到达时间比较,从而计算等待时间。
数据结构
- 结构体struct node{int come, time}:come:到达时间,time:处理时间;
- vector<node> custom:存放可以接受服务的顾客数据;
- vector<int> window(k, 8 * 3600):k窗口数目,各个窗口的初始可用时间设置为8点,通过更新此值模拟各窗口处理客户需求;
关键点
- 需要考虑客户数目为0的情况,因为0作为除数会出错,需要单独处理;
- 晚于17点的客户,不做处理,故不需要录入他们的数据;
- 模拟的关键是窗口的可用时间window[i],顾客的到达时间node.come,和顾客的处理时间node.time.当到达时间大于最快窗口可用时间时,更新窗口可用时间window[i]=node.come+node.time ,当到达时间小于最快窗口可用时间时,需要等待window[i]-node.come 且window[i]+=node.time;
3,代码
#include<iostream>
#include<stdio.h>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
struct node{
int come, time; //come: 到达时间,time:处理需求用时
}tempNode; //声明一个tempNode变量
bool cmp(node a, node b){
return a.come < b.come;
}
int main(){
//#ifdef ONLINE_JUDGE
//#else
// freopen("1.txt", "r", stdin);
//#endif
int n, k; //n排队的总人数 k窗口数
cin>>n>>k;
vector<node> custom;
for(int i = 0; i < n; i++){
int h, m, s, p;
scanf("%d:%d:%d %d", &h, &m, &s, &p);
int comeTime = h * 3600 + m * 60 + s;
if(comeTime <= 17 * 3600){ //早于17点来排队的顾客加入custom中
tempNode = {comeTime, p * 60}; //还有这种用法 秀
custom.push_back(tempNode);
}
}
sort(custom.begin(), custom.end(), cmp); //将排队人员按先后顺序排序
double totalTime = 0;
vector<int> window(k, 8 * 3600); //存放窗口可用的时间 初始化为8点
for(int i = 0; i < custom.size(); i++){
int minTime = window[0], minWin = 0;
for(int j = 1; j < k; j++){ //寻找最快可用的窗口
if(minTime > window[j]){
minTime = window[j];
minWin = j;
}
}
if(minTime <= custom[i].come){ //该顾客到来时 窗口可用(已包括早于8点到达的情况)
window[minWin] = custom[i].time + custom[i].come;// !!!
}else{
totalTime += (window[minWin] - custom[i].come);//顾客来早了 需要等待
window[minWin] += custom[i].time; //更新窗口的可用时间
}
}
if(custom.size() == 0) printf("0.0"); //若没有顾客 除数为0 会出错 故需要单独处理
else printf("%.1f", totalTime / (60 * custom.size()));
return 0;
}