您的位置:首页 > 产品设计 > UI/UE

1017. Queueing at Bank (25)

2016-07-06 19:50 691 查看

目录

目录

原题

思路

注意

代码

原题

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: