N人去银行排队,每个人需要交易时间,8点上班,每个窗口前有黄线,黄线前的队列最大人数是M,其他人须在黄线外等待,等有空时找人数最少的队列进去排,计算每个人交易结束的时间。
按照正常的逻辑是分三部分:1 入队 2 迎客 3 送客 可是这样做出来的结果有偏差
#include<iostream>
#include<queue>
using namespace std;
int N,M,K,Q;
struct customer{
int process_time,leave_time;
};
customer c[1000];
int main()
{
int i,j,cursor=1;
cin>>N>>M>>K>>Q;//N为几个窗口或队列M每没队列最大人数K为总人数Q为查询人数
queue<int>q[N];
for(i=1;i<=K;i++)cin>>c[i].process_time;
for(int time=480;time<1020;time++){
//入队
for(i=0;i<M;i++){
for(j=0;j<N;j++){
if(q[j].size()<M){
if(cursor<=K){
q[j].push(cursor);
cursor++;
}
}
}
}
//迎客
for(i=0;i<N;i++){
if(q[i].size()){
j=q[i].front();
if(c[j].leave_time==0)c[j].leave_time=time+c[j].process_time;
}
}
//送客
for(i=0;i<N;i++){
if(q[i].size()){
j=q[i].front();
if(c[j].leave_time==time)q[i].pop();
}
}
}
while(Q--){
cin>>i;
if(c[i].leave_time==0)cout<<"Sorry"<<endl;
else{
printf("%02d:%02d\n",c[i].leave_time/60,c[i].leave_time%60);
}
}
}
答案正确的是 1 送客2 入队 3 迎客
#include<iostream>
#include<queue>
using namespace std;
int N,M,K,Q;
struct customer{
int process_time,leave_time;
};
customer c[1000];
int main()
{
int i,j,cursor=1;
cin>>N>>M>>K>>Q;//N为几个窗口或队列M每没队列最大人数K为总人数Q为查询人数
queue<int>q[N];
for(i=1;i<=K;i++)cin>>c[i].process_time;
for(int time=480;time<1020;time++){
//送客
for(i=0;i<N;i++){
if(q[i].size()){
j=q[i].front();
if(c[j].leave_time==time)q[i].pop();
}
}
}
//入队
for(i=0;i<M;i++){
for(j=0;j<N;j++){
if(q[j].size()<M){
if(cursor<=K){
q[j].push(cursor);
cursor++;
}
}
}
}
//迎客
for(i=0;i<N;i++){
if(q[i].size()){
j=q[i].front();
if(c[j].leave_time==0)c[j].leave_time=time+c[j].process_time;
}
}
while(Q--){
cin>>i;
if(c[i].leave_time==0)cout<<"Sorry"<<endl;
else{
printf("%02d:%02d\n",c[i].leave_time/60,c[i].leave_time%60);
}
}
}
为什么呢
你这个银行模拟是全部人一下都来,然后计算每个人离开的时间。
先送客,这样把队列空出来好让新的顾客进队。你入队为什么要循环一遍M,没看懂。
我之前也写过一个银行离散事件模拟,顾客不定时来银行,寻找人数最少的队列进队排队。计算顾客的平均逗留时间。https://blog.csdn.net/qq_46523755/article/details/115437923
C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html
C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html