前两天感觉还没思路来着
今天做了1017题,感觉差不多,有点思路
第一次用队列。。。
刚开始想建立n个队列,天真的这么写。。。
vector< queue<int> > wait;后来看到这边https://segmentfault.com/q/1010000007253685试了一下,直接就这样写就行
queue<int> wait[n];之前代码中就是下面这样扒拉扒拉一通写,所幸误打误撞不用改
wait[j].pop();代码如下:
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
struct cust{
int need;//需要服务的时间
int start;//开始服务的时间
int end;//结束服务的时间
};
int open=8*60;//开门时间
int close=17*60;//关门时间
vector<cust> a;
//queue<int> wait;//每个窗口设置一个长度为M的等待队列
vector<int> win;//记录窗口的当前时间
vector<int> check;
int main(){
//input
int n,m,k,q;
scanf("%d%d%d%d",&n,&m,&k,&q);
queue<int> wait[n];
for(int i=0;i<k;i++){
//scanf("%d",&a[i].need);
cust c;
cin>>c.need;
a.push_back(c);
}
//int check[q];
for(int i=0;i<q;i++){
//scanf("%d",&check[i]);
int b;
cin>>b;
check.push_back(b-1);
}
for(int i=0;i<n;i++) win.push_back(open);//窗口值初始化为八点
if(n*m>=k){//等待人数都在黄线内
for(int i=0;i<k;i++){
a[i].start=win[i%n];
win[i%n]+=a[i].need;
a[i].end=win[i%n];
}
}
else{
for(int i=0;i<m*n;i++){//前m*n个客户先在n个窗口前黄线排好队
wait[i%n].push(i);
}
for(int j=0;j<n;j++){//服务第一个客户
a[wait[j].front()].start=win[j];
win[j]+=a[wait[j].front()].need;
a[wait[j].front()].end=win[j];
wait[j].pop();
}
int pos;
for(int i=m*n;i<k;i++){//黄线外的客户全部进入黄线
//找窗口值最小的下标
pos=distance(win.begin(),min_element(win.begin(),win.end()));
a[wait[pos].front()].start=win[pos];
win[pos]+=a[wait[pos].front()].need;
a[wait[pos].front()].end=win[pos];
wait[pos].pop();
wait[pos].push(i);
}
//服务在黄线内的剩余客户
for(int j=0;j<n;j++){
while(!wait[j].empty()){
a[wait[j].front()].start=win[j];
win[j]+=a[wait[j].front()].need;
a[wait[j].front()].end=win[j];
wait[j].pop();
}
}
}
//output
for(int i=0;i<q;i++){
if(a[check[i]].start>=close){
printf("Sorry\n");
}
else{
printf("%02d:%02d\n",a[check[i]].end/60,a[check[i]].end%60);
}
}
}
本文介绍了一种使用队列解决银行客户排队问题的方法。通过建立多个队列来模拟银行窗口的服务流程,并实现了客户服务时间的计算。文章详细展示了如何初始化队列、处理客户请求以及输出结果。

701

被折叠的 条评论
为什么被折叠?



