您的位置:首页 > 大数据 > 人工智能

1014. Waiting in Line (30)

2016-06-28 17:51 447 查看

目录

目录

原题

思路

代码

原题

1014. Waiting in Line (30)

思路

有几个窗口就设定几个队列,外加一个黄线外的队列。每个队列独立计时。模拟银行服务过程运行,使用数组记录每一个顾客的服务时间。查询时,就直接输出时间即可。

代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <queue>

struct customer {
int rank, time;
};

void process(std::queue<customer> *que, std::queue<customer> &out_yell, int *time, int *everyone);
int n, m, k;
int main(void) {
int q, query, hour, minute, *everytime;
scanf("%d %d %d %d", &n, &m, &k, &q);
std::queue<customer> *que = new std::queue<customer>
;
std::queue<customer> out_yell;
everytime = new int[k + 1];

for (int i = 1; i < k + 1; i++) {
customer temp;
scanf("%d", &(temp.time));
temp.rank = i;
out_yell.push(temp);
everytime[i] = temp.time;
}

int *time = new int
, *everyone = new int[k + 1];
memset(time, 0, sizeof(int) * n);
memset(everyone, -1, sizeof(int) * k);

process(que, out_yell, time, everyone);

for (int i = 1; i < k + 1; i++) {
if (everyone[i] - everytime[i] >= 540) {
everyone[i] = -1;
}
}
for (int i = 0; i < q; i++) {
scanf("%d", &query);
if (-1 == everyone[query]) {
printf("Sorry\n");
}
else {
hour = everyone[query] / 60 + 8;
minute = everyone[query] % 60;
printf("%02d:%02d\n", hour, minute);
}
}

delete[] time;
delete[] everyone;
delete[] que;
delete[] everytime;
return 0;
}

void process(std::queue<customer> *que, std::queue<customer> &out_yell, int *time, int *everyone) {
customer person;
while (que[n - 1].size() < m) {
for (int i = 0; i < n; i++) {
if (out_yell.empty()) {
break;
}
person = out_yell.front();
out_yell.pop();
que[i].push(person);
}
if (out_yell.empty()) {
break;
}
}

int criticalq, criticalt;
while (!out_yell.empty()) {
criticalt = INT_MAX;
for (int i = 0; i < n; i++) {
if (time[i] + que[i].front().time < criticalt) {
criticalt = time[i] + que[i].front().time;
criticalq = i;
}
}
time[criticalq] += que[criticalq].front().time;
everyone[que[criticalq].front().rank] = criticalt;
que[criticalq].pop();
person = out_yell.front();
out_yell.pop();
que[criticalq].push(person);
}
while (true) {
criticalt = INT_MAX;
for (int i = 0; i < n; i++) {
if (!que[i].empty() && time[i] + que[i].front().time < criticalt) {
criticalt = time[i] + que[i].front().time;
criticalq = i;
}
}
if (INT_MAX == criticalt) {
break;
}
time[criticalq] += que[criticalq].front().time;
everyone[que[criticalq].front().rank] = criticalt;
que[criticalq].pop();
}
return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: