Each input file contains one test case. Each case starts with a line containing 4 positive integers: N (<=20, number of windows), M (<=10, the maximum capacity of each line inside the yellow line), K (<=1000, number of customers), and Q (<=1000, number of customer queries).
The next line contains K positive integers, which are the processing time of the K customers.
The last line contains Q positive integers, which represent the customers who are asking about the time they can have their transactions done. The customers are numbered from 1 to K.
Output
For each of the Q customers, print in one line the time at which his/her transaction is finished, in the format HH:MM where HH is in [08, 17] and MM is in [00, 59]. Note that since the bank is closed everyday after 17:00, for those customers who cannot be served before 17:00, you must output “Sorry” instead.
Sample Input
2 2 7 5
1 2 6 4 3 534 2
3 4 5 6 7
Sample Output
08:07
08:06
08:10
17:00
Sorry
这个题是模拟进程的,然而我并不知道,我就是模拟的,用的队列。
最坑爹的地方在最后一句话“ who cannot be served before 17:00。。。”,我一直以为是最后的时间到了就关门,做不完拉倒,然而并不是,当时一直错,心里很纳闷,就从网上找找,结果是自己理解错了,然后又改,又错了,原因是“之前”,有个before没看见,结果又把等号去掉,结果过了。就是用队列模拟,没啥好说的。读题不够认真是真的。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
using namespace std;
struct node{
int x,ord;
}a[1010];
int main(){
int n,m,k,q;
queue<node>q_line[1010];
int len = 0;
int peo = 0;
int h = 8,ms = 0;
int h_array[1010],m_array[1010];
int s_array[1010],sm_array[1010];
scanf("%d%d%d%d",&n,&m,&k,&q);
for(int i = 1;i<=k||peo<k;i++){
if(i<=k){
scanf("%d",&a[i].x);
a[i].ord = i;
}
if(len == n*m||i>k){
int tmp;
int a_num = 0x3f3f3f,now_number;
for(int j = 0;j<n;j++){
if(q_line[j].empty())continue;
if(q_line[j].front().x < a_num){
now_number = j;
a_num = q_line[j].front().x;
}
}
ms+=a_num;
h+=ms/60;
ms %= 60;
for(int j = 0;j<n;j++){
if(q_line[j].empty())continue;
int ord_temp = q_line[j].front().ord;
if(j == now_number){
h_array[ord_temp] = h;
m_array[ord_temp] = ms;
q_line[j].pop();
len--;
peo++;
if(q_line[j].empty())continue;
s_array[q_line[j].front().ord] = h;
sm_array[q_line[j].front().ord] = ms;
}else{
tmp = q_line[j].front().x - a_num;
if(tmp)q_line[j].front().x = tmp;
else {
q_line[j].pop();
h_array[ord_temp] = h;
m_array[ord_temp] = ms;
len--;
peo++;
if(q_line[j].empty())continue;
s_array[q_line[j].front().ord] = h;
sm_array[q_line[j].front().ord] = ms;
}
}
}
}
if(len < n*m && i<=k){
int a_line = 10010,now_line;
for(int j = 0;j<n;j++){
if(q_line[j].size()<a_line){
now_line = j;//calcute the shortest line
a_line = q_line[j].size();
}
}
q_line[now_line].push(a[i]);
s_array[i] = 8;
sm_array[i] = 0;
len++;
}
}
int x;
for(int i = 0 ;i<q;i++){
scanf("%d",&x);
if(s_array[x]*100 + sm_array[x] >= 1700)puts("Sorry");
else{
if(h_array[x]<=9)printf("0%d:",h_array[x]);
else {
printf("%d:",h_array[x]);
}
if(m_array[x]<=9)printf("0%d\n",m_array[x]);
else {
printf("%d\n",m_array[x]);
}
}
}
}