一开始题意理解错了。
是17:00之前还没开始服务的就不能服务了。
不是说不能完成就sorry了。
另外这种模拟题一旦用数组和很多游标
自己就很容易出错。
以后还是要尽量少用了。
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define maxn 1111
int que[20][maxn];//记录队列的情况
int pre[20];//记录队列头指针
int cur[20];//记录当前指针
int ans[maxn];//记录每个节点的完成时间
int tim[maxn];//记录每个顾客的时间
int n,m,k,q;
int findpre()
{
int minn,flag,i;
minn=maxn;
for(i=0;i<n;i++)
if(ans[que[i][pre[i]]]<minn)
{
minn=ans[que[i][pre[i]]];
flag=i;
}
return flag;
}
void showtime(int x)
{
x=x-1;
int beg=ans[x]-tim[x];
int i=ans[x]/60;
int j=ans[x]%60;
if(beg>=540)
printf("Sorry\n");
else
printf("%02d:%02d\n",i+8,j);
}
int main()
{
int i,j,l,x,y;
scanf("%d %d %d %d",&n,&m,&k,&q);
for(i=0;i<k;i++)
scanf("%d",&tim[i]);
x=0;//代表第几位顾客
for(i=0;i<m;i++)//队伍的第几个人
for(j=0;j<n;j++)//第几号窗口
{
que[j][i]=x;
if(i==0)
ans[x]=tim[x];
else
ans[x]=ans[que[j][i-1]]+tim[x];
x++;
}
for(i=0;i<n;i++)
{
pre[i]=0;
cur[i]=m;
}
while(x<k)
{
y=findpre();//找到队列头所需时间最小的那个队列
que[y][cur[y]]=x;
//printf("%d %d %d\n",y,cur[y],x);
ans[x]=ans[que[y][cur[y]-1]]+tim[x];
pre[y]++;
cur[y]++;
x++;
}
for(i=0;i<q;i++)
{
scanf("%d",&j);
showtime(j);
}
return 0;
}