Kotahi 2023-10-04 13:43 采纳率: 100%
浏览 10
已结题

模拟(关键词-调度问题)

电梯的调度问题
电梯的调度逻辑如下:若一部电梯一开始处于禁止状态,当有一人发出命令(向上或者向下),电梯会从原始楼层发往指定的楼层,这时电梯会被赋予一个运行状态,
这里我们假定电梯在一层,而有人在五层发出指令向下到一楼,这时电梯向上运行,即此时电梯会倾向于向上运行的乘客,即若此时二层有一位乘客想上去七楼,
则电梯会优先将其带上七楼之后再下到五楼将五楼的乘客带下去,而这时若有人在三层选择向上,但是电梯会优先将五层的乘客带到一楼再去接三层的乘客。
因此电梯的调度规则可以理解为:电梯每次运行一个方向,顺路的都带上,到达用户请求的最高层(最底层)之后,才可以掉头。
现在你应该大致了解了电梯的调度规则,我们将模拟一栋单电梯楼的电梯运行,有一台电梯,在一栋楼中运行,正常运行时2s钟可以上一层楼梯,当达到需要停靠的楼层时停留3s,
在不同的楼层中会有乘客发出不同的请求,你需要模拟电梯的运行,求出在一次运行中所花费的时间。(一次运行指的是从电梯开始运行到电梯运送完最后一名乘客)
假设乘客不会点击电梯中的关门开门键,电梯在收到指令之后立马执行其中的开门,关门等操作时间不记,电梯初始一直在一层。
第一行输入一个数n代表楼层的最大高度(最底层为一层)
第二行t代表在一次运行中操作的人数
然后你将得到t行
依次分别为时间(从第一次指令记为0),操作的楼层,以及想要到达的楼层
输出则为运行需要的总时间,以及最终停留的楼层(二者空格隔开)
输入样例
4
2
0 2 4
1 1 4
输出样例
27 4
样例解释
电梯在一层收到二层的向上到四楼的指令,向上运行,一秒后一层的也发出指令去四层,但是此时电梯已经向上运行,运行到指令的最高层之后才会返回,则到达二层之后停留三秒,之后到达四层停留三秒,
到达一层接到乘客停留三秒,之后直接向上到达四层,结束运行。总时间为停留三次加上运行了九个楼层共为27s,最后停留在四层。

请用模拟的思路解决问题,不使用较难的数据结构与算法

  • 写回答

8条回答 默认 最新

  • 忧伤的玩不起 2023-10-04 16:52
    关注

    这是一个比较复杂的问题,问AI回答肯定是不行的.情况比较多我也未必一定会写的都对,不过case是过了,你先试试能不能过把

    #include <iostream>
    #include <vector>
    #include <cmath>
    
    struct Passenger {
        int time;
        int start_floor;
        int target_floor;
        int direction = 0;// 乘坐电梯方向
        int status; //0:未上电梯,1:在电梯上,2:已坐完电梯
    };
    
    void elevatorSimulation(int max_floor, Passenger passengers[],int passenger_count) {
        int current_floor = 1;  // 初始电梯位置在一层
        int total_time = 0;     // 总时间
        int direction = 1;      // 电梯初始向上运行
        int target_floor = 1;   // 当前运行状态下的目标楼层
        int passenger_endcount = 0; //完成乘坐的电梯
        while(true){
            bool stop = false;
            for(int i =0;i<passenger_count;i++){
                if(passengers[i].status == 0){
                    if(passengers[i].direction == direction && passengers[i].time <= total_time ){
                        // 电梯接人状态
                        if(direction >0 && passengers[i].target_floor > target_floor){
                            target_floor = passengers[i].target_floor;
                        }else if(direction <0 && passengers[i].target_floor < target_floor){
                            target_floor = passengers[i].target_floor;
                        }
                        if(passengers[i].start_floor == current_floor){
                            stop = true;
                            passengers[i].status++;
    
                        }
                    }
                }
                if(passengers[i].status == 1){
                    if(passengers[i].target_floor == current_floor){
                        stop = true;
                        passengers[i].status++;
                        passenger_endcount++;
                    }
                }
            }
            if(passenger_endcount == passenger_count)break;
            if(stop){
                total_time += 3;
            }
            current_floor+=direction;
            if(current_floor == target_floor){
                direction = -direction;
                for(int i =0;i<passenger_count;i++){
                    if(passengers[i].status == 0){
                        if(direction <0  && passengers[i].start_floor < target_floor){
                            target_floor = passengers[i].start_floor;
                        }else if(direction >0  && passengers[i].start_floor > target_floor){
                            target_floor = passengers[i].start_floor;
                        }
                    }
                }
            }
            total_time+= 2;
    
        }
        // 输出结果
        std::cout << total_time << " " << current_floor << std::endl;
    }
    
    int main() {
        int max_floor, passenger_count;
        Passenger passengers[1001];
        while(std::cin >> max_floor){
            std::cin>>passenger_count;
            for (int i = 0; i < passenger_count; ++i) {
                std::cin >> passengers[i].time >> passengers[i].start_floor >> passengers[i].target_floor;
                passengers[i].status    = 0;
                passengers[i].direction = passengers[i].target_floor > passengers[i].start_floor ? 1: -1;
            }
            // 调用电梯模拟函数,计算总时间
            elevatorSimulation(max_floor, passengers,passenger_count);
        }
        return 0;
    }
    /*
    4
    2
    0 2 4
    1 1 4
    */
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 10月14日
  • 已采纳回答 10月6日
  • 创建了问题 10月4日

悬赏问题

  • ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
  • ¥15 PPOCRLabel
  • ¥15 网友们我该怎么办啊,急
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 目标跟踪,计算机视觉
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏
  • ¥15 Windows Server2016本地登录失败