【PAT】A1014. Waiting in Line(queue模拟)
@(PAT)
链接:https://www.patest.cn/contests/pat-a-practise/1014
思路:
1. 题目意思是有n条queue,然后每条queue有排队人数限制m,超出m后的进入候选区域,在候选区域的人中,如果queue有空位(当前排队人数< m),就选queue中较少人的编号较小的队伍排。使用queue来模拟排队。
2. 需要注意的是当开始服务的时间>= 17:00,就输出”Sorry”,如果在16:59分开始服务,服务了9999分钟,也是可以的。
3. 注意queue的一些细节:如果你把vector里面的数据push进queue,然后用queue.front()来获取并修改数据,这在vector里面的数据是不影响的,因为push进queue的相当于重新复制了一份,所以修改的不是原来vector里面地址的数据。
4. 一开始模拟时间的时候用了for循环,t<= (17-8)* 60分钟,有一个点过不去,原因是有一些服务结束的时间会超过(17-8)* 60分钟,所以最后改成while循环,判断完成的人的个数,就过了。
这道题浪费了很多的时间,但是不太难,原因还是对queue不太熟悉,还有一些题目细节没有弄清楚,希望能吃一堑长一智吧
My AC code:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Customer
{
int id;
int time_need;
int time_use_now;
Customer(int Id, int need, int now) {
id= Id;
time_need= need;
time_use_now= now;
}
};
void myPrint(int begin, int need) {
if (begin>= (17-8)* 60) {
printf("Sorry\n");
return;
}
int time= begin+ need;
int h= 8+ time/ 60;
int m= time% 60;
printf("%02d:%02d\n", h, m);
}
int main() {
int n, m, k, q;
scanf("%d%d%d%d", &n, &m, &k, &q);
vector<Customer> customers;
vector<int> begin;
for (int i= 0; i< k; i++) {
int temp;
scanf("%d", &temp);
Customer ctemp(i, temp, 0);
customers.push_back(ctemp);
begin.push_back(0);
}
vector<queue<Customer> > qs_in;
for (int i= 0; i< n; i++) {
queue<Customer> qtemp;
qs_in.push_back(qtemp);
}
queue<Customer> q_out;
// at t= 0
for (int i= 0; i< n; i++) {
for (int j= 0; j< m; j++) {
if (i+ j* n< k) {
qs_in[i].push(customers[i+ j* n]);
} else {
break;
}
}
}
int in_line= n* m;
// customers.size()> in_line
if (k> in_line) {
for (int i= in_line; i< customers.size(); i++) {
q_out.push(customers[i]);
}
}
int finished= 0;
int t= 0;
while (finished!= k) {
t++;
for (int i= 0; i< n; i++) {
if (!qs_in[i].empty()) {
qs_in[i].front().time_use_now++;
if (qs_in[i].front().time_use_now>= qs_in[i].front().time_need) {
qs_in[i].pop();
finished++;
if (!qs_in[i].empty()) {
begin[qs_in[i].front().id]= t;
}
}
}
}
for (int i= 0; i< n; i++) {
if (qs_in[i].size()< m) {
if (!q_out.empty()) {
Customer new_in= q_out.front();
qs_in[i].push(new_in);
q_out.pop();
}
}
}
}
for (int qi= 0; qi< q; qi++) {
int query;
scanf("%d", &query);
myPrint(begin[query- 1], customers[query- 1].time_need);
}
}