PAT-A-1014 Waiting in Line (30 分) 模拟 C++题解

1014 Waiting in Line (30 分)

一、题目大意

题目传送门:1014 Waiting in Line (30 分)
银行有n个窗口,每个窗口前面最多可排m个人,共有k个人来银行办理业务,已知了每个人办理业务需要花费的时间。求指定的q个人什么时刻可以办完业务。银行在8:00上班,在17:00之后下班,如果处理到某人已经下班了则输出Sorry。每个窗口排满了m个人后,剩下的人要等候有人办完业务后才能排入窗口前的队伍,优先选择窗口人少的排,如果有多个窗口人数相同,则选择编号小的。

二、解题思路

本题使用的数据结构是vector<list<int>>D,也就是把每个窗口的队伍都看成是一个list链表。用vector<int>leave存储每个人办完业务离开时的时间。

  1. 如果k<=n*m的话,那么所有人都可以全部排好。那么所有人办理业务的结束时间可以直接算出来。前n个人直接排在每个窗口的最前面,他们办完业务后离开时的时间就是他们办业务所需时间(因为他们是第一波嘛)。后面的人离开时间为他们前面人的离开时间加上这个人办理业务所花时间。

  2. 如果k>n*m的话,我们可以先将前n*m个人先排好,如1所示,然后循环遍历每个链表的头,看表头中哪个人离开时间最早,就将剩下的人中入队一个到这个队中,离开时间同1计算方式。然后这个队头出队。

  3. 注意点:这道题中虽说17:00下班,但是如果某个人在17:00之前被服务,那么会等到这个人被服务完才下班。而如果这个人还没服务到他就已经是超过17:00了则不被服务,输出Sorry。这个点我刚开始没想到,以至于只过了一半数据。我将超过17:00被服务的人的leave设置为INT_MAX,最后判断如果这个人的leave值为INT_MAX则输出Sorry,这里改过来后就AC了。

三、AC代码

#include <bits/stdc++.h>
using namespace std;
template<typename T = int>
T read(){
   
    T x;
    cin >> x;
    return x;
}
template <typename T = int>
void OO(vector<T>v, string s=""){
   
    cerr<<s <<":"<< endl;
    for(auto i: v){
   
        cerr << i << ' ';
    }
    cerr << endl;
}
typedef unsigned long long ll;
int main(){
   
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值