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 (<=10000) - 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

代码

#include<iostream>
#include<algorithm>
using namespace std;
struct customer{
    int arrive;int time;int wait;int flag=1;
};
bool cmp(struct customer a,struct customer b){
    return a.arrive<b.arrive;
}
int main(){
    int n,k,hh,mm,ss,count=0,min=0,sum=0,flag=0;
    scanf("%d%d",&n,&k);
    struct customer c[n];
    int q_time[k];
    fill(q_time,q_time+k,8*3600);
    for(int i=0;i<n;i++){
        scanf("%d:%d:%d %d",&hh,&mm,&ss,&c[i].time);
        c[i].arrive=hh*3600+mm*60+ss;
        if(c[i].arrive>17*3600) c[i].flag=0;
    }
    sort(c,c+n,cmp);
    for(int i=0;i<n;i++){
        if(c[i].flag){
            for(int j=0;j<k;j++){
                if(q_time[j]<q_time[min]) min=j;
            }
            if(c[i].arrive<q_time[min]){
                c[i].wait=q_time[min]-c[i].arrive;q_time[min]+=c[i].time*60;
            }else if(c[i].arrive>=q_time[min]){
                c[i].wait=0;q_time[min]=c[i].arrive+c[i].time*60;
            }   
            count++;
        }
    }
    for(int i=0;i<n;i++) if(c[i].flag) sum+=c[i].wait;
    printf("%.1f",(double)sum/(60*count)); 
    return 0;
}

测试结果

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 12,159评论 0 10
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 13,468评论 0 23
  • 写了几十篇 ACL 2015 paper 的概述,大部分看过,错误应该不少,欢迎指正。首发于和朋友一起做的公众号“...
    hzyido阅读 11,273评论 0 5
  • 17.9.9日考完中级(单单一门课程),如释重负,身心彻底放松了,付了优酷会员看了一天的司马懿,很满足。 备考阶段...
    镜花水月小花汪_4dd4阅读 968评论 0 0
  • “字海”网站9月2日最新​​更新。 经过国内外广大网友的共同努力,特别是“unicode汉字交流群”汉字研究学者的...
    叶叶sama阅读 7,162评论 1 1