题目1326:Waiting in Line
本题在浙大PAT上有同样的题目,但两个OJ对题目的解读并不同,区别在于对
“for those customers who cannot be served before 17:00, you must output
‘Sorry’ instead.”这句话的理解。
九度要求对于17点之前未处理完成的,一律为sorry。
浙大PAT上要求17:00之前如果开始处理,那么要给出处理完的时间。而对于还在排队
的,均为sorry。
下面是浙大PAT上AC的代码,九度上只需要稍微改动一下,大体思想相同,感觉类似CPU调度时的时间片轮转算法,
排队就是简单的FIFO。
#include<iostream>
#include<cstdio>
using namespace std;
class Lineitem
{
public:
int trans;
int no;
};
Lineitem line[22][12];
int cus[1002];
int res[1002];
int main()
{
freopen("input.in", "r", stdin);
freopen("output.out","w", stdout);
int n, m, k, q, i, j;
int cusP = 0,time=0;
cin >> n >> m >> k >> q;
for (i=0; i<k; i++)
{
cin >> cus[i];
}
//队伍排满
for (j=0; j<m; j++)
{
for (i=0; i<n; i++)
{
if (cusP>=k)//队伍无人
{
line[i][j].no = -1;
line[i][j].trans = 0;
}
else
{
line[i][j].no = cusP;
line[i][j].trans = cus[cusP++];
}
}
}
for (time=1; time<540; time++)
{
for (i=0; i<n; i++)
{
//本队无客户,去下一队
if (line[i][0].no == -1)
{
continue;
}
line[i][0].trans--;//每个窗口同步服务当前客户
//客户服务完毕,下一客户进队
if (line[i][0].trans == 0)
{
res[line[i][0].no] = time;//记录当前客户完成时间
//依次前移
for (j=0; j<m-1; j++)
{
line[i][j] = line[i][j+1];
}
//新客户入队
if (cusP<k)
{
line[i][j].no = cusP;
line[i][j].trans = cus[cusP++];
}
else
{
//无新客户
line[i][j].no = -1;
line[i][j].trans = 0;
}
}
}//end of for i
}//end of for time
//时间到,还在处理的处理完
for (i=0; i<n; i++)
{
if (line[i][0].no != -1)
{
res[line[i][0].no] = time+line[i][0].trans-1;
}
}
//还在队内sorry
for (i=0; i<n; i++)
{
for (j=1; j<m; j++)
{
if (line[i][j].no==-1)
{
break;
}
res[line[i][j].no] = -1;
}
}//*/
//还在黄线外sorry
while (cusP<k)
{
res[cusP++] = -1;
}
int index;
for (i=0; i<q; i++)
{
cin >> index;
index--;
if (res[index] == -1||n==0||m==0)
{
printf("Sorry\n");
}
else
{
printf ("%02d:%02d\n", res[index]/60+8, res[index]%60);
}
}
return 0;
}