题目链接: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行。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐