模拟的题。
代码如下:
#include"stdio.h"
#include"string.h"
#include"math.h"
#include<iostream>
#include<vector>
#include<set>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
#define INF 0x7FFFFFFF
struct customer{
int startTime;
int processingTime;
int leaveTime;
};
int n,m,k,q;
vector<struct customer> customers;
vector<int> queries;
vector<queue<int>> bank;
int main(){
scanf("%d %d %d %d",&n,&m,&k,&q);
bank.resize(n);
vector<int> baseTime(n,0);
customers.resize(k);
for(int i = 0;i < k;i++){
int temp;
scanf("%d",&temp);
customers[i].processingTime = temp;
}
queries.resize(q);
for(int i = 0;i < q;i++){
int temp;
scanf("%d",&temp);
temp--;
queries[i] = temp;
}
int p = 0;
for(;p < m*n && p < k;p++){ //题目很明确的说,如果队列没满,就是很顺序的排序。 //漏了个p<k所以总是报短段错误。
customers[p].leaveTime = baseTime[p%n]+customers[p].processingTime;
baseTime[p%n] = customers[p].leaveTime;
bank[p%n].push(p);
}
//队列外的人
for(;p < k;p++){
int mmin = INF;
int index = -1;
for(int i = 0;i < n;i++){
int top = bank[i].front(); //本来自己写这里,老师想着直接用i%x(某一个x),然后来获得队首的值,有一个模拟队列,就漂亮多了。
//注,这里是获得队尾元素。。理解错误。
if(customers[top].leaveTime < mmin){
mmin = customers[top].leaveTime;
index = i;
}
}
//pop and push
customers[p].leaveTime = baseTime[index] + customers[p].processingTime;
baseTime[index] = customers[p].leaveTime;
bank[index].pop();
bank[index].push(p);
}
for(int i = 0;i < q;i++){
if(customers[queries[i]].leaveTime - customers[queries[i]].processingTime >= 540){ //之所以要见processingtime,
//因为如果16:55来一个人,但17:05才走,是可以的
printf("Sorry\n");
}else{
printf("%02d:%02d\n", 8+customers[queries[i]].leaveTime/60, customers[queries[i]].leaveTime%60);
}
}
return 0;
}