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

目录

1,题目描述

题目大意

输入

输出

说明

2,思路

数据结构

关键点

3,代码


1,题目描述

扫描二维码关注公众号,回复: 9170314 查看本文章

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;
}
发布了45 篇原创文章 · 获赞 5 · 访问量 2184

猜你喜欢

转载自blog.csdn.net/qq_41528502/article/details/104249920