1017. Queueing at Bank (25)

目录

原题

1017. Queueing at Bank (25)

思路

在读取客户时就把到达时间大于或等于17:01的客户去掉。设定一个队列,每当一个窗口出现空闲,而且队列里有人,就出队一个人。记录每一个人的到达时间和开始服务的时间、完成服务的时间。

注意

此题和1014. Waiting in Line略有不同。那就是,17:00:00以及之前到达的顾客都可以得到服务,结束服务的时间=开始服务的时间+服务时间。而1014里,一到17:00:00所有顾客不管是正在服务的还是未曾服务的,都需要离开;对于在17:00:00之前未曾轮到的顾客(包括正好在17:00:00轮到的顾客)都需要输出sorry。不注意到这一点,此题最后的测试点无法通过。

代码

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <cstring>

const int starttime = 8 * 3600;
const int endtime = 17 * 3600;

struct customer {
    int hour1, min1, sec1;
    int date1, date2, date3;
    int process;
};

bool cmp(customer c1, customer c2);
void process(std::vector<customer> &vec, int k);

int main(void) {
    int n, k;
    setvbuf(stdin, new char[1 << 20], _IOFBF, 1 << 20);
    scanf("%d %d", &n, &k);
    customer *windows = new customer[k];
    customer temp;
    std::vector<customer> vec;
    int count = 0;
    for (int i = 0; i < n; i++) {
        scanf("%d:%d:%d %d", &temp.hour1, &temp.min1, &temp.sec1, &temp.process);
        temp.date1 = temp.hour1 * 3600 + temp.min1 * 60 + temp.sec1;
        temp.process = temp.process * 60 > 3600 ? 3600 : temp.process * 60; // No one can occupy the window for more than one hour
        if (temp.date1 <= endtime) {
            vec.push_back(temp);
        }
    }
    std::sort(vec.begin(), vec.end(), cmp);
    process(vec, k);
    int wait_time = 0;

    for (int i = 0; i < (int)vec.size(); i++) {
        wait_time += vec[i].date2 - vec[i].date1;
    }
    printf("%.1lf", wait_time / 60.0 / vec.size());
    delete[] windows;
    return 0;
}

bool cmp(customer c1, customer c2) {
    return c1.date1 < c2.date1;
}

void process(std::vector<customer> &vec, int k) {
    customer *wid = new customer[k];
    memset(wid, 0, sizeof(customer) * k);
    int time, i, nthwin;
    for (i = 0; i < (int)vec.size() && i < k; i++) {
        wid[i] = vec[i];
        wid[i].date2 = starttime > wid[i].date1 ? starttime : wid[i].date1;
        wid[i].date3 = wid[i].date2 + wid[i].process;
        vec[i] = wid[i];
    }
    for (; i < (int)vec.size(); i++) {
        time = INT_MAX;
        for (int j = 0; j < k; j++) {
            if (time >= wid[j].date3) {
                time = wid[j].date3;
                nthwin = j;
            }
        }
        vec[i].date2 = wid[nthwin].date3 > vec[i].date1 ? wid[nthwin].date3 : vec[i].date1;
        vec[i].date3 = vec[i].date2 + vec[i].process; // all customers will end their procession at the time of 17:00:00
        wid[nthwin] = vec[i];
    }

    delete[] wid;
    return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值