1017. Queueing at Bank (25)

1017 Queueing at Bank (25分)

Suppose a bank has K windows open for service. There is a yellow line in front of the windows which devides the waiting area into two parts. All the customers have to wait in line behind the yellow line, until it is his/her turn to be served and there is a window available. It is assumed that no window can be occupied by a single customer for more than 1 hour.

Now given the arriving time T and the processing time P of each customer, you are supposed to tell the average waiting time of all the customers.

Input Specification:

Each input file contains one test case. For each case, the first line contains 2 numbers: N (≤10​4​​) - the total number of customers, and K (≤100) - the number of windows. Then N lines follow, each contains 2 times: HH:MM:SS - the arriving time, and P - the processing time in minutes of a customer. Here HH is in the range [00, 23], MM and SS are both in [00, 59]. It is assumed that no two customers arrives at the same time.

Notice that the bank opens from 08:00 to 17:00. Anyone arrives early will have to wait in line till 08:00, and anyone comes too late (at or after 17:00:01) will not be served nor counted into the average.

Output Specification:

For each test case, print in one line the average waiting time of all the customers, in minutes and accurate up to 1 decimal place.

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

记路一下自己的思路(不是完美的):建立两个SET的集合,一个用来对所有用户进行排序,一个用来对窗口服务进行排序。然后用循环进行处理 ,要考虑的是用户到达窗口是是否有人或银行是否开门。对各种情况进行排序。由于不能把情况进行整合从而导致考虑的条件太多而有漏洞有一个测试点不能通过。以下是我的非AC代码。

今天看了其他大神的解法,发现自己没有考虑的(准确的是理解题意的偏差)是对17点前到达而没有能够被服务的顾客,计算他们的等待时间要按照前面的一样进行排序,等待的时间不是用银行关门的时间减去顾客到达的时间,而是顾客前一个等待并完成(在排序中的完成)后的时间减去顾客到达的时间。感觉这样的计算方法是与实际情况不符。但可以对算法进行简化从而使代码更精简运行效率更快。

总结的经验,不要把每种情况都分析的得很细,将多种情况汇总才是更高效简单的方法,不容易出现疏漏,减少代码的长度。

此代码为我自己写的AC代码,不是最优解,有许多需要进行改进的地方:

#include<cstdio>
#include<set>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
    int hour,minute,second,time,work,finish;
};
bool cmp(node person1,node person2){
    return person1.time<person2.time;
}
struct cmp1{
    bool operator() (const node &a,const node &b)const{
    return a.time<b.time;
    }
};
struct cmp2{
    bool operator() (const node &a,const node &b)const{
    return a.finish<b.finish;
    }
};
int main(){
    int m,n;
    scanf("%d %d",&m,&n);
    int waitTime=0,number=0;
    set<node,cmp1> customer;
    set<node,cmp2> server;
    int closeTime=17*3600;
    int openTime=8*3600;
    for(int i=0;i<m;i++){
        node data;
        scanf("%d:%d:%d %d",&data.hour,&data.minute,&data.second,&data.work);
        data.time=data.hour*3600+data.minute*60+data.second;
        customer.insert(data);
    }
    set<node>::iterator cusit=customer.begin();
    set<node>::iterator winit=server.begin();
    int window =n;
    for(;cusit!=customer.end();cusit++){
        int wait=0;
        winit=server.begin();
        node candidate=*cusit;
        if(candidate.time>closeTime){
            continue;

        }
        else if(window>0){
            if(candidate.time<openTime){
                candidate.finish=openTime+candidate.work*60;
                wait=openTime-candidate.time;
            }
            else {
                candidate.finish=candidate.time+candidate.work*60;
            }
            server.insert(candidate);
            waitTime+=wait;
            window--;
            number++;
        }
        else if(window==0){
                winit=server.begin();
                node servered=*winit;
                if(servered.finish<=closeTime){
                    if(servered.finish>=candidate.time){
                        wait=servered.finish-candidate.time;
                        candidate.finish=servered.finish+candidate.work*60;
                        waitTime+=wait;
                        number++;
                    }
                    else if(servered.finish<candidate.time){//第4-5测试点的考察对象
                    candidate.finish=candidate.time+candidate.work*60;
                    number++;
                    }
                    server.erase(winit);
                    server.insert(candidate);
                }
                else{//第6个考察的地方
                    wait = servered.finish-candidate.time;
                    candidate.finish=servered.finish+candidate.work*60;
                    server.erase(winit);
                    server.insert(candidate);
                    waitTime +=wait;
                    number++;
                }
        }
    }
    double average=waitTime*1.0/60/number;
    if(number==0){
        average=0;
    }
    printf("%.1f",average);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Queueing theory is a mathematical study of waiting lines or queues that arise in various real-life scenarios, such as customer service, traffic congestion, hospital emergency rooms, and telecommunications networks. Basic queueing theory involves the following concepts: 1. Arrival Process: This is the process of customers arriving at the queue. The arrival process can be modeled using different distributions, such as Poisson or exponential. 2. Service Process: This is the process of serving customers in the queue. The service process can also be modeled using different distributions, such as Poisson or exponential. 3. Queue Length: This is the number of customers waiting in the queue at any given time. 4. Queue Occupancy: This is the proportion of time that the server is busy serving customers. 5. System Capacity: This is the maximum number of customers that the system can handle at any given time. 6. Utilization: This is the proportion of time that the server is busy serving customers compared to the total time. 7. Waiting Time: This is the time that a customer spends waiting in the queue before being served. 8. Service Time: This is the time that a customer spends being served by the server. 9. Queueing Models: There are different queueing models that can be used to analyze queueing systems, such as the M/M/1 model, M/M/c model, M/G/1 model, and M/D/1 model. 10. Performance Measures: Different performance measures can be used to evaluate queueing systems, such as average waiting time, average queue length, and system throughput.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值