#include<algorithm>
#include<iostream>
#include<cstdio>
#include <queue>
using namespace std;
const int MAXC = 10010, MAXW = 22, ONE_HOUR = 60;
typedef struct Customer
{
int need_time, end_time;//客户需要的时间和被服务结束的时间
}Customer;
typedef struct Windows
{
int next_time;//该窗口服务完下一个顾客后的时间和服务完最后一个顾客的时间
int end_time;
}Windows;
int N, M, K, Q;
Customer Cust[MAXC] = {{0}};
queue<int> WinQ[MAXW];//每个窗口排的队
Windows WinT[MAXW];
int main()
{
scanf("%d %d %d %d", &N, &M, &K, &Q);
for(int i=1; i<=K; i++)
{
scanf("%d", &Cust[i].need_time);
int tag = 0;
for(int j=1; j<N; j++)//判断该客户应该进入哪个窗口的队列
{
if(WinQ[j].size() < WinQ[tag].size()
|| (WinQ[j].size() == WinQ[tag].size()
&& WinT[j].next_time < WinT[tag].next_time)) tag = j;
}
Cust[i].end_time = WinT[tag].end_time + Cust[i].need_time;//该客户被服务完的时间
WinQ[tag].push(Cust[i].need_time);//把该客户入队
WinT[tag].end_time += Cust[i].need_time;//该窗口服务完该客户后的时间
if((int)WinQ[tag].size() == M)//若该窗口的队列已经排满则服务队前的客户
{
WinT[tag].next_time += WinQ[tag].front();
WinQ[tag].pop();
}
}
for(int i=0, k; i<Q; i++)
{
scanf("%d", &k);//若给该客户被服务开始时间大于17点则输出sorry,否则除数被服务结束的时间
if(Cust[k].end_time-Cust[k].need_time+8*ONE_HOUR >= 17*ONE_HOUR) printf("Sorry\n");
else printf("%02d:%02d\n", 8+Cust[k].end_time/60, Cust[k].end_time%60);
}
return 0;
}
PAT (Advanced Level) Practice A1014 Waiting in Line (30 分)(C++)(甲级)(队列)
最新推荐文章于 2022-07-11 12:04:36 发布
本文介绍了一种基于窗口服务效率的排队系统优化算法,通过动态分配客户到不同窗口,实现排队系统的高效运行。算法考虑了客户等待时间、窗口服务速度及排队长度等因素,旨在减少客户等待时间,提高整体服务质量。
(C++)(甲级)(队列)&spm=1001.2101.3001.5002&articleId=88069396&d=1&t=3&u=2c1301e74dbe40518af24cf005811ec0)
348

被折叠的 条评论
为什么被折叠?



