数据结构——窗口流动客户问题

问题描述

在这里插入图片描述

分析

  1. 拿到问题的时候时间比较仓促,估计题目原来的考点和意思就是想用队列表示。自己感觉又有那么一点生产者和消费者问题的意思。
  2. 要求用C语言编写,但是自己对C语言的线程不是很感冒,所用还是用了常规的方法将这道题给做了,时间仓促,后来又不想改了,如有错误的地方,欢迎大家批评指正。

具体实现

  1. 因为程序每次运行时的随机数是不变的,所以人数的190是我跑了一次才得出的,如果想一次就得出结果的话,可以自己设置一个计数器,同时需要一个变量记录总时间(可能会超出int),最后再来算平均时间。
#include<iostream>
#include<ctime>
#include<cstdlib>

using namespace std;
int main(){
    // 生成随机数,模拟客户
    int cost[300];
    int AllTime = 0;
    cost[0]=0;
    for(int i=1;i<300 && AllTime<=7200;i++)
    {
        cost[i] = cost[i-1]+rand()%(35 - 25 + 1) + 25;
        AllTime =cost[i];
        // cout<<cost[i]<<endl;
    }

    int window_1[200];
    int window_2[200];
    
    int a_head=0;//窗口_1的指针
    int a_tail=0;
    int a_waitTime=0;//窗口_1队列中等待的时长
    int a_serverTime=0;//窗口_1总的等待时间+总的服务时间
    int b_head=0;//窗口_2的指针
    int b_tail=0;
    int b_waitTime=0;//窗口_2队列中等待的时长
    int b_serverTime=0;//窗口_2总的等待时间+总的服务时间
    int i=0;//客户数组指针

    int withoutServer=0;//没有得到服务的客户数量
    int maxServer =0;//最大服务时间
    int maxWaitServer=0;
    int minServer =130;//最小服务时间
    int minWaitServer=7200;

    int temp2=0;
    int costNum=0;
    float averageServerTime=0;


    // 模拟时钟周期2h
    for(int j=0;j<=7200;j++)//每秒检测
    {

         if(j==cost[i])//检测到是否有客人来
        {
            temp2=rand()%((130)-(20)+1)+20;//客户服务时长
            
            // 求客户的服务最大最小时长
            if(temp2>maxServer) maxServer = temp2;
            if(temp2<minServer) minServer= temp2;
           
            
            if(((a_tail-a_head)<(b_tail-b_head))||((a_tail-a_head)==(b_tail-b_head)))//窗口一人数较少
            {
                if((a_waitTime+temp2)<(7200-j))//时间来得及办理业务
                {
                    window_1[a_tail]=temp2;
                    a_waitTime+=temp2;

                    if(a_waitTime>maxWaitServer)  
                    {
                        maxWaitServer = a_waitTime;
                    }  
                    if(a_waitTime<minWaitServer)
                    {
                        minWaitServer = a_waitTime;
                    }   

                    a_tail+=1;  
                    costNum+=1;
                    averageServerTime+=(1.0*a_waitTime/190);
                    cout<<"第"<<j<<"秒,第"<<i<<"位客人来到"<<"窗口一,"<<"需要服务时间"<<temp2<<",一共服务时间"<<a_waitTime<<",前面有"<<a_tail-a_head-1<<"位人等待"<<endl;
                }
                else
                {
                    withoutServer +=1;
                }  
            }
            else
            {
                if((b_waitTime+temp2)<(7200-j))//时间来得及办理业务
                {
                    window_2[b_tail]=temp2;
                    b_waitTime+=temp2;

                    if(b_waitTime>maxWaitServer)
                    {
                        maxWaitServer = b_waitTime;
                    }
                    if(b_waitTime<minWaitServer)
                    {
                        minWaitServer = b_waitTime;
                    }

                    b_tail+=1;   
                    costNum+=1;
                    averageServerTime+=(1.0*b_waitTime/190);
                    cout<<"第"<<j<<"秒,第"<<i<<"位客人来到"<<"窗口二,"<<"需要服务时间"<<temp2<<",一共服务时间"<<b_waitTime<<",前面有"<<b_tail-b_head-1<<"位人等待"<<endl;
                }
                else
                {
                    withoutServer +=1;
                }
            }
            i+=1;
        }   



        if(window_1[a_head]==0)//检测窗口_1是否办理完毕
        {
            if((a_head+1<a_tail)||(a_head+1==a_tail))
            {
                a_head+=1;
            }
        }
        else
        {
            window_1[a_head]-=1;
            if(a_waitTime>0)
            {
                a_waitTime-=1;
            }
           
        }

        if(window_2[b_head]==0)//检测窗口_2是否办理完毕
        {
            if((b_head+1<b_tail)||(b_head+1==b_tail))
            {
                b_head+=1;
            }
        }
        else
        {
            window_2[b_head]-=1;
            if(b_waitTime>0)
            {
                b_waitTime-=1;
            }
        }   

       
    }
    cout<<"最大服务时长:"<<maxServer<<"最小服务时长"<<minServer<<endl;
    cout<<"最大服务时长(含等待时间)"<<maxWaitServer<<"最小服务时长(含等待时间)"<<minWaitServer<<endl;
    cout<<"服务客人数:"<<costNum<<endl;
    cout<<"平均服务时间(含等待时间)"<<averageServerTime<<endl;
    cout<<"未服务的人数:"<<withoutServer<<endl;
    cout<<"程序正常退出。";

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值