PAT(A) 1017 Queueing at Bank (25 point(s)) C++ 测试点0,5

注意:

  1. 计算平均等待时间时应除以被银行服务的人数,而不是排队的总人数N,否则Case0:Wrong Answer
  2. 银行会服务完所有17点前开始排队的顾客,而不是到17点关门,否则Case5:Wrong Answer (Case5中最晚会服务到半夜零点半左右,这什么神仙银行!
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;

#define OPEN 8*60*60
#define CLOSE 17*60*60

struct node{
    int arr, pro;
};

bool cmp(node a, node b){
    return a.arr < b.arr;
}

int getWindow(vector<int> w){
    int j = 0;
    for(int i = 1; i < w.size(); i++)
        if(w[j] > w[i]) j = i;
    return j;
}

int main(void){
    int N, K;
    scanf("%d %d", &N, &K);
    
    vector<node> v(N);
    vector<int> w(K, OPEN);
    
    for(int i = 0; i < N; i++){
        int hh, mm, ss, p;
        scanf("%d:%d:%d %d", &hh, &mm, &ss, &p);
        v[i].arr = hh*60*60 + mm*60 + ss;
        v[i].pro = p*60;
    }
    sort(v.begin(), v.end(), cmp);
    
    int wait = 0, i;
    for(i = 0; i <N && v[i].arr <= CLOSE; i++){
        int j = getWindow(w);
        if(w[j] > v[i].arr)
            wait += w[j]-v[i].arr, w[j] += v[i].pro;
        else
            w[j] = v[i].arr+v[i].pro;
    }
    
    printf("%.1f", 1.0*wait/60/i);
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值