改进的电梯调度程序
1. 学习心得
1.1 关于文件读写
其实我觉得这个没什么好说的,就是翻翻API,不会了man 3 freopen
就这样
1.2 关于Git Commit规范
我有句MMP一定要说
2. 改进过程
2.1 外围代码的修改
2.1.1 文件输入输出
因为程序不需要往多个地方输入输出,直接重定向标准输入输出流就完事了
freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);
在main()开头加两行就行,因为程序运行完就退出,所以不需要考虑文件描述符(句柄)泄漏
2.1.2 外围调度部分
其实这个本来不用改,是我自己傻逼了
2.2 核心调度的修改
2.2.1 魔改预估时间法
上次在移植大佬的算法的过程中发现,他的算法整体思想并没有用到乘客只去1层和10层的假设,只是在有些地方数据写死了而已,只需要把这些写死的数据换成合适的变量就可以了。
至于最后那些计算公式的推导过程有没有用到假设就不知道了,反正程序能跑而且跑得挺正常的。2.2.2 带顺向截梯控制的扫描算法
其实就是让电梯在1层和10层之间往复运动,如果有乘客到达目的地则停,如果有与电梯运行方向相同的请求则停
施工中3. 踩坑记录
3.1 Windows可执行文件
无比巨坑
3.1.1 MinGW工具链和依赖库
Bootstrapping MinGW工具链的辛酸过程就不写了,编译出来的东西复制到Windows上会缺两个库(我的电脑上是两个,别的电脑就不知道了),保险起见开编译选项-static
静态链接。
3.1.2 MSVC和GCC所带的STL行为不一致
GCC上正向迭代器的base()返回其所指代的元素指针,而在MSVC中只有反向迭代器有base()返回其所对应的正向迭代器,正向迭代器没有这个成员
CMake生成VS项目文件后打开一大片红,这也是为什么我最后选择MinGW3.1.3 字符编码问题
程序输出中文乱码,控制台chcp 65001后正常
所以我猜想这是字符编码问题,MinGW按照UTF-8将文本字符写进程序,但输入输出库默认调用的是A系列API,在中文版Windows上接受GBK字符串,需要将MinGW配置为执行字符集使用GBK 解决:编译选项添加-fexec-charset=gbk
3.1.4 Git
全静态链接出来的可执行文件体积达10+M,多个版本后git仓库体积爆增
本来想用git rebase
或者git gc
这种黑魔法从历史中删除仓库对象,但是想想容易玩脱 所以我想可以让EXE单独stage然后commit,使这个commit处于History最顶端,需要修改时直接丢弃这个commit,修改后commit,再编译,再commit,最后git push --force
强制推到远端 4. 测试样例
1 1 02 1 03 1 04 1 05 1 0
0 5 10 5 40 5 70 5 90 5 10
0 10 10 9 10 7 10 4 10 2 1
1 2 33 2 15 3 57 2 36 9 0
66666 3 966667 7 266660 5 266663 8 966673 1 9
5. 统计
时间 | Bug数 | 行数 |
---|---|---|
~3h | ~5 | ~480 |