这一题做的时候遇到几个坑点
①对应测试点1: 这个是我错了很久的,一直提示段错误,当然后来发现是我自己编程习惯不好。即如果窗口数大于总人数,那有些窗口在一开始就没有人来办理业务,所以如果直接对每个窗口正在办理业务的客户之间-1的话,就会出现段错误。
例:窗口数20,总人数 1人,那2-20号窗口一开始就没有客户,所以在clock++进行计时的时候,窗口1的客户时间需要-1,而2-20号窗口没有客户,所以不可以-1
②对应测试点4、5: 即只要在17:00之前进入窗口进行业务办理,但还未办理完成的,不管多久,都会到办理完成为止
例:一个人16:49分进入1号窗口办理业务,要办理120分钟,则他的完成时间为18:49
[AC代码]
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
struct node{
int num,t,endt=-1;
};
int n,m,k,Q,u,now;
node p[1005];
vector<node> q[25];
vector<node>::iterator it;
void trans(int t){ //时间格式的转换
if(t==-1) cout<<"Sorry"<<endl;
else printf("%02d:%02d\n",8+t/60,t%60);
}
bool is_Empty(){ //判断当前n个窗口是否还有客户(用于17:00之后)
for(int j=1;j<=n;j++){
it=q[j].begin();
if(it!=q[j].end()&&it->t>0) return false;
}
return true;
}
int main()
{
cin>>n>>m>>k>>Q;
for(int i=1;i<=k;i++) p[i].num=i,cin>>p[i].t;
for(int i=1;i<=n*m&&i<=k;i++){
int minl=1000; //要每次都对minl初始化,不然后面的数据就无法输入了
for(int j=1;j<=n;j++)
if(q[j].size()<minl) minl=q[j].size(),u=j;
q[u].push_back(p[i]);
}
int clock=0;
now=n*m+1;
while(clock<539){ //8:00-16:59 的客户办理情况
clock++;
for(int j=1;j<=n;j++){ //分钟每次+1,便对n个窗口正在办理业务的客户时间-1
it=q[j].begin();
if(it!=q[j].end()){ //这里一定要判断一下窗口是否为空,因为可能窗口数大于总人数,所以有些窗口一开始就没有人
it->t--;
if(it->t==0){ //如果当前客户时间减为0
p[it->num].endt=clock; //①则记录下该客户的离开时间
q[j].erase(it); //②并让该客户离开窗口
if(now<=k) q[j].push_back(p[now]),now++; //③下一位等待的客户进入黄线内队列
}
}
}
}
while(!is_Empty()){ //17:00之前已经在窗口办理业务,但尚未完成的客户
clock++;
for(int j=1;j<=n;j++){
it=q[j].begin();
if(it!=q[j].end()){
it->t--;
if(it->t==0){ //如果当前客户时间减为0
p[it->num].endt=clock; //①则记录下该客户的离开时间
}
}
}
}
int query;
for(int i=0;i<Q;i++){
cin>>query;
trans(p[query].endt);
}
return 0;
}