目录

​1,题目描述​

​题目大意​

​输入​

​输出​

​说明​

​2,思路​

​数据结构​

​关键点​

​3,代码​


1,题目描述

PAT_甲级_1017 Queueing at Bank (25分) (C++)【模拟+结构体排序】_PAT

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:

8.2

题目大意

银行有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;
}