题目链接:PAT【甲级】1014
题目简述:n个窗⼝,每个窗⼝可以排队m⼈。有k位用户需要服务,给出了每位⽤户需要的分钟数,所有客户在8点开始服务,如果有窗⼝还没排满用户就去排队,否则就在⻩线外等候。如果有某窗户前的一个用户服务完毕了,⻩线外的⼈就进来⼀个。如果同时发生就选窗⼝数⼩的,求q个⼈的服务结束时间。
#include<iostream>
#include<queue>
using namespace std;
int n, m, k, q, v[1005], mtime[25], vis[1005];
queue<int> line[25];
int main(){
cin >> n >> m >> k >> q;
for (int i = 1; i <= k;i++){
cin >> v[i];
if(i <= n * m){
if(i % n == 0) line[n].push(i);
else line[i % n].push(i);
}
}
int t = k > m * n ? m * n + 1 : k + 1;
for (int i = 1; i <= 540;i++){
for (int j = 1; j <= n;j++){
if(!line[j].empty()){
if(i == v[line[j].front()] + mtime[j]){
mtime[j] = v[line[j].front()] = i;
vis[line[j].front()] = 1;
line[j].pop();
if(t <= k) line[j].push(t++);
}else if(i == 540 && mtime[j] <= i){
v[line[j].front()] += mtime[j];
vis[line[j].front()] = 1;
}
}
}
}
while(q--){
int id;
cin >> id;
if(vis[id] == 0)
cout << "Sorry" << endl;
else
printf("%02d:%02d\n", v[id] / 60 + 8, v[id] % 60);
}
return 0;
}
代码思想
开始是想排序的,但觉得不太好搞太麻烦了,估计还得设计结构体来封装信息就没进行编写。后来想到了这种办法,相当于:一条时间线不断往下走,如果某用户的服务时间正好满足那么就记录;同时遍历窗户时从小到大也能满足黄线外用户进入排队的条件。
特别注意
17:00这个时间节点,一定要读清题目,是要求17:00之前的用户只要开始服务了那么就直接服务完,对应上面代码第26行。