PAT【甲级】1014

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值