小菜dog 2022-03-30 15:10 采纳率: 100%
浏览 20
已结题

ATM柜台机子排队问题

题目

img

疑惑

逻辑思路理不清楚,希望能指导一下,帮我理清楚一下逻辑思路。

我的解答思路和尝试过的方法

构建2个对象,一个是客户对象(属性:客户ID,客户进入时间,客户业务所需要时间)
一个是ATM队列对象(属性:一些队列的基本方法,我是以客户对象作为一个节点)
详细代码:

//
#include <iostream>
using namespace std;
class Client {
public:
    int NO, enter_Time, spend_Time, leave_Time;
    friend class Atm_Queue;
    Client(int x = 0, int y = 0, int z = 0) {
        NO = x, enter_Time = y, spend_Time = z, leave_Time = 0;
    }
};
class Atm_Queue {
public:
    int size, rear, front, capacity;
    int leaveTime;
    //Client client;
    Client* array;
    bool isEmpty() {
        if (size== 0) {
            return true;
        }
        else { return false; }
    }
    bool isFull() {
        if (size == capacity) {
            return true;
        }
        else { return false; }
    }
    int getsize() {
        return size;
    }
    bool isElement() {
        if (!isEmpty()) {
            return true;
        }
        else
        {
            return false;
        }
    }
    Atm_Queue(int x=10) {
        capacity = x;
        size = 0;
        front = 1;
        rear = 0;
        leaveTime = 0;
        array = new Client[x];
    }
    void  enterAtm_Queue(Client *c) {
        size++;
        rear = rear + 1 % capacity;
        array[rear].enter_Time = c->enter_Time;
        array[rear].spend_Time = c->spend_Time;
        cout <<"enterqueue:  " << array[rear].enter_Time << "  " << array[rear].spend_Time<< "  "<<c->NO<<endl;
    }
    void pushAtm_Queue() {
        if (isEmpty())
            cout << "error" << endl;
        else {
            size--;
            front = (front + 1) % capacity;
        }
    }
    int getfront() {
        static int i = 0;
        if (i==0)
        {
            array[front].leave_Time = array[front].spend_Time + array[front].enter_Time + leaveTime;
            leaveTime = array[front].leave_Time;
            i++;
        }
        else
        {
            leaveTime = array[front].spend_Time + leaveTime;
        }
        return leaveTime;
    }
};
class USER {
public: Client *array;
};
class ATM {
public: 
      Atm_Queue* Atmarray;
};
//是否需要排队
bool isLineUp(ATM atm,int User_enterTime) {
    if (( atm.Atmarray + 0)->leaveTime>User_enterTime &&(atm.Atmarray + 1)->leaveTime > User_enterTime&& (atm.Atmarray + 2)->leaveTime > User_enterTime 
        ) {
        return  true;
    }
    else
    {
        return false;
    }

}
//获取人最少,且ATM编号做少的ATM编号
int MinSizeAtmId(ATM atm) {
    int min,minflag;
    min = (atm.Atmarray + 0)->getsize();
    for (int i = 0; i < 3; i++) {
        if (min>(atm.Atmarray + i)->getsize())
        {
            min = (atm.Atmarray + i)->getsize();
            minflag = i;
        }
    }
    return minflag;
}
int main()
{
    int n;
    cin >> n;
    USER user;
    ATM atm;
    user.array= new Client[n];
    atm.Atmarray = new Atm_Queue[3];
    for (int i = 0; i < n; i++) {
        // 获取数据
        (user.array+i)->NO = i + 1;
        cin >> (user.array + i)->enter_Time >> (user.array + i)->spend_Time;
         /*有人来,是否需要排队*/
        //需要排队
        if(isLineUp(atm, (user.array + i)->enter_Time)) {
            ((atm.Atmarray + 0))->enterAtm_Queue((user.array + i));
            (user.array + i)->leave_Time = ((atm.Atmarray + 0))->getfront();
            continue;
            
        }
        //需要不排队
        else
        {
            //第一台ATM机当前没有人,直接用。
            if (((atm.Atmarray + 0))->size == 0 && ((atm.Atmarray + 0))->leaveTime < (user.array + i)->enter_Time)
            {
                ((atm.Atmarray + 0))->enterAtm_Queue((user.array + i));
                (user.array + i)->leave_Time = ((atm.Atmarray + 0))->getfront();
                ((atm.Atmarray + 0))->pushAtm_Queue();
                continue;
            }

            //第二台ATM机当前没有人,直接用。
            else if (((atm.Atmarray + 1))->size == 0 && ((atm.Atmarray + 1))->leaveTime < (user.array + i)->enter_Time)
            {
                ((atm.Atmarray + 1))->enterAtm_Queue((user.array + i));
                (user.array + i)->leave_Time = ((atm.Atmarray + 1))->getfront();
                ((atm.Atmarray + 1))->pushAtm_Queue();
            }
            //第三台ATM机当前没有人,直接用。
            else if (((atm.Atmarray + 2))->size == 0 && ((atm.Atmarray + 2))->leaveTime < (user.array + i)->enter_Time)
            {
                ((atm.Atmarray + 2))->enterAtm_Queue((user.array + i));
                (user.array + i)->leave_Time = ((atm.Atmarray + 2))->getfront();
                ((atm.Atmarray + 2))->pushAtm_Queue();
            }


        }

        /*****************************************************/
         
    
    }
}



我想要达到的结果

img

img

  • 写回答

1条回答 默认 最新

  • 嘉祐-小萝卜算子 2022-03-30 16:18
    关注

    大概思路,是 你有一个 时间轴
    时间轴有3种类型 1.到达时间 2 办理时间 3 离开时间
    最开始没有人的时候,时间轴是停止不动的,可以定义为0
    然后将 每个人的到达时间 都记录在时间轴上,从小到大,比如 第一个 人 是 30,第二个人是 33
    然后对于距离最近的时间节点类型做判断
    1.这个时间节点是 到达时,给他按照题目规则选择 合适的ATM机,同时将他的 办理时间(暂定) 和离开时间(暂定) 放到时间轴上 比如第一个人 就是 办理时间30 离开时间 40
    2.这个时间节点是 离开时,按照题目规则记录,判断是否有人需要重新排队,如果需要的话,修改他的办理时间(暂定) 和离开时间(暂定)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月7日
  • 已采纳回答 3月30日
  • 创建了问题 3月30日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装