电梯
Github地址
题目
一栋10层的大楼(楼层编号1-10),设有一台无限载重的电梯,初始时电梯停在1层。电梯移动1层的耗时为1,在某一层停靠的耗时为1(时间初始为0)。为了使得乘客等待的时间(电梯在目的层的停靠时刻 - 乘客发出请求时刻)总和最小,请你编写一个程序来进行电梯调度。
- 输入有5个请求,每个请求一行,格式为请求时刻 起始楼层数 去往方向,其中方向为0代表向上去往10层,为1代表向下去往1层。
输出每次对应的决策,每一行的输出格式为xx时,停靠在x楼。其中,“xx时刻”指的是在某层楼停靠的时刻,且不算入在该层的停靠时间。如:
- 当0时刻时,电梯此时在1层,输入有0 1 0,那么电梯从1层接客(1s)前往10层(9s),应输出10时,停靠在10楼(1+9=10)。此时,该乘客等待时间为(10-0=)10。
- 当0时刻,电梯此时在1层,输入有0 2 0,那么电梯从1层前往2层(1s),接上乘客(1s),前往10层(8s),应输出10时,停靠在10楼(1+1+8=10)。此时,该乘客等待时间为(10-0=)10s。
最后输出完成5个请求(所有乘客都到达目的地)后,各乘客的等待时间总和。
版次 | 调试时长 | 代码行数 | 调试的bug数 |
---|---|---|---|
1 | 4-5h | 155行 | 5-9个 |
第一版
假设条件
电梯的请求是一起输入的:即有预约/未卜先知机制
原理
- 根据每一趟序列进行调度
- 代码中维护了一个等待链
- 对于完整的一趟从楼底到楼底的过程,通过判断算法判断下一个请求层是否应该上电梯
- 判断算法为=当在这层等待时其他人消耗的总等待时间和等待的人重新上车的等待时间的比较
- 先写只载客,相应每一层请求时间最短的请求
- 问题:可能存在情况,当接了这个人之后下一个人不是全局最优了;
解决:考虑动态规划或者枚举
情况
bug:4个- 1. 对于每一趟运行时,每层只允许一名乘客上车
- 2.
程序无输入输出 - 3.
程序中文乱码 4. 解的处理问题,程序逻辑错误
第二版
- 想法:直接模拟真实电梯,对数据进行统计
- 电梯:从一楼开始运行,送到目标位置停止,有需求则移动到需求位置,当请求队列为空时停止运行并输出答案
- 写法:载入输入,在电梯运行到请求时间时发起请求,电梯载客到目标结束
设定:输入按请求时间排序好,不存在请求和目标楼层相同的情况,电梯在下一请求未到且当前无请求时,移动到五楼以减少等待时间
文档
n
:乘客的数量;
Global_time
:电梯运行的全局时间;
passengerL
:乘客的信息数组,由结构体passenger
定义,包含request_time
请求时间,request_place_from
乘客的请求楼层,request_place_to
乘客的目标楼层,request_wait_time_long
等待时间,request_arrive_time
到达时间;
passengerQ
:乘客的队列数组,由结构体queue
定义,包含use
是否在等待队列,arrive
是否到达;
floor_wait
:楼层的等待时间,1为等待,过每个楼层时重置;
lift_position
:电梯运行的当前位置;
void pre()
:对数据进行初始化;
void in()
:数据输入部分;
void in()
:数据输入部分;
void run()
:电梯运行部分;
void out()
:数据输出部分;