pat1014 关于c++队列问题

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