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
存储每个人办完业务离开时的时间。
-
如果
k<=n*m
的话,那么所有人都可以全部排好。那么所有人办理业务的结束时间可以直接算出来。前n个人直接排在每个窗口的最前面,他们办完业务后离开时的时间就是他们办业务所需时间(因为他们是第一波嘛)。后面的人离开时间为他们前面人的离开时间加上这个人办理业务所花时间。 -
如果
k>n*m
的话,我们可以先将前n*m
个人先排好,如1所示,然后循环遍历每个链表的头,看表头中哪个人离开时间最早,就将剩下的人中入队一个到这个队中,离开时间同1计算方式。然后这个队头出队。 -
注意点:这道题中虽说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(){