PAT 1014 模拟
模拟题,维护几个队列,每次选出剩余处理时间最小的元素并更新队列,推进全局时间。注意题目的意思是开始时间在17:00(含)以后的顾客才sorry。
代码:
#include <iostream>
#include <queue>
#include <string.h>
#include <iomanip>
using namespace std;
int N,M,K,Q;
const int maxn = 1050;
struct customer{
int id;
int remainTime;
int serveTime;
}p[maxn];
queue<customer> q[maxn];
int res[maxn];
int main(){
memset(res, -1, sizeof(res));
cin>>N>>M>>K>>Q;
// 输入顾客
for(int i = 1;i <= K;i++){
cin>>p[i].remainTime;
p[i].id = i;
p[i].serveTime = p[i].remainTime;
if(i <= N*M)
q[(i%N==0)?N:(i%N)].push(p[i]);
}
int waiting = N*M+1;
int currentTime = 0;
while(true){
int min = 0x3f3f3f;
int pos = -1;
for(int i = 1;i <= N;i++){
if(q[i].size() != 0){
if(q[i].front().remainTime < min){
min = q[i].front().remainTime;
pos = i;
}
}
}
if(pos == -1) break;
int minus = q[pos].front().remainTime;
res[q[pos].front().id] = currentTime+min;
for(int i = 1;i <= N;i++){
if(q[i].size() != 0){
q[i].front().remainTime -= minus;
}
}
q[pos].pop();
if(waiting <= K){
int minSize = 0x3f3f3f;
int posSize = -1;
for(int i = 1;i <= N;i++){
if(q[i].size() < minSize){
minSize = (int) q[i].size();
posSize = i;
}
}
q[posSize].push(p[waiting]);
waiting++;
}
currentTime += min;
}
while(Q--){
int tmp = 0;
cin>>tmp;
if(res[tmp]<0 || res[tmp]-p[tmp].serveTime>=540) cout<<"Sorry"<<endl;
else{
cout<<setiosflags(ios::fixed)<<setfill('0')<<setw(2)<<8+res[tmp]/60<<":"<<setiosflags(ios::fixed)<<setfill('0')<<setw(2)<<res[tmp]%60<<endl;
}
}
}
21ms