AcWing 1486. 排队等候
原题链接
中等
作者:
leo123456
,
2020-09-01 09:52:23
,
所有人可见
,
阅读 545
#include<iostream>
#include<cstring>
#include<queue>
#include<unordered_map>
using namespace std;
const int N=20;
int n,m,k,Q;
int sum[N];//当前这个窗口处理当前这些人到什么时候
queue<int> q[N]; //维护一个窗口,存每个人办完的时间
int main()
{
cin>>n>>m>>k>>Q;
unordered_map<int,int> hash;
for(int i=1;i<=k;i++)
{
int s;
cin>>s;
int t=0;
for(int j=0;j<n;j++)
if(i<=n*m) //窗口没满,选少的
{
if(q[j].size()<q[t].size()) t=j;
}
else
{
if(q[j].front()<q[t].front()) t=j;//窗口满了,选每个窗口第一个最先完成的
}
sum[t]+=s; //当前窗口最后一个人完成的时间+我的任务处理时间,就是我的结束时间
if(i>n*m) q[t].pop(); //因为现在要加入一个人,所以把第一个给pop掉,所有窗口第一个完成的也是
q[t].push(sum[t]); //把这个人加入窗口
if(sum[t]-s<540) hash[i]=sum[t]; //如果这个人的开始时间是5点之前就处理,否则不用记录,处理结束可能超过5点
}
while(Q--)
{
int id;
cin>>id;
if(hash.count(id)) printf("%02d:%02d\n",hash[id]/60+8,hash[id]%60);
else printf("Sorry\n");
}
return 0;
}
##### 有没有可能存在一种情况,所有窗口均已排满, 而每个窗口的第一个客户办理时间是540分钟,当编号大于n*m的客户来了之后,就无法处理,这样的样例代码也能通过吗?