//1014. Waiting in Line (30)
/*
解题思路:
对每个要加入队列的人进行以下两类考虑:
1)找到长度最短的队列,将当前考虑的元素加入进去。
2)如果队列长度都已经满的情况下,找到最先出来的元素,pop出来,然后将新的元素push进去。
特点:
排队题基本不需要考虑超时;
*/
/*
有三个case的测试点是:
注意条件是要在17:00之前serve的都可以,比如说某顾客从16:00-18:00结束,那么输出结果为18:00而不是Sorry。
*/
//accepted
#include <iostream>
#include <queue>
using namespace std;
int main()
{
int N, M, K, Q;
scanf("%d%d%d%d", &N,&M,&K,&Q);
int time[1005];
queue<int> que[25];
int result[1005];
int i;
for (i = 1;i<=K;i++)
{
scanf("%d", &time[i]);
}
int QueryNum = 0;
//count
int curr = 1;
que[0].push(curr);
result[curr] = time[1];
curr++;
int j;
int MinLen = M;
int MinIndex = -1;
int BeginTime[25];
int MinTime = 700;
int MinTimeIndex = -1;
fill(BeginTime, BeginTime+N+1, 0);
BeginTime[0] = time[1];
int k;
while (curr <= K)
{
MinIndex = -1;
MinLen = K;
MinTimeIndex = -1;
MinTime = 700;
//找到数组长度最小的
for (j=0;j<N;j++)
{
if (que[j].size() < MinLen )
{
MinLen = que[j].size();
MinIndex = j;
}
}
if (MinLen == N)
{
//找到最早可以结束的加入进去
for (j = 0;j<N;j++)
{
int tmp = que[j].front();
if (result[tmp] < MinTime)
{
MinTime = result[tmp];
MinTimeIndex = j;
}
}
if (MinTimeIndex == -1)
{
for (k = curr;k<=K;k++)
{
result[curr] = 541;
}
break;
}
que[MinTimeIndex].pop();
que[MinTimeIndex].push(curr);
result[curr] = BeginTime[MinTimeIndex] + time[curr];
BeginTime[MinTimeIndex] = result[curr];
}
else
{
que[MinIndex].push(curr);
result[curr] = BeginTime[MinIndex] + time[curr];
BeginTime[MinIndex] = result[curr];
}
curr++;
}
for (i = 0;i<Q;i++)
{
scanf("%d", &QueryNum);
int r = result[QueryNum];
if (r > 540)
{
if (r - time[QueryNum] < 540)
{
printf("%02d:%02d\n", r/60+8, r%60);
}
else
printf("Sorry\n");
}
else
{
printf("%02d:%02d\n", r/60+8, r%60);
}
}
return 0;
}
PAT 1014. Waiting in Line (30)
最新推荐文章于 2022-01-24 00:02:12 发布