电梯
仓库地址:https://github.com/vjudge0913/FZU_homework3
题目:
一栋10层的大楼(楼层编号1-10),设有一台无限载重的电梯,初始时电梯停在1层。电梯移动1层的耗时为1,在某一层停靠的耗时为1(时间初始为0)。为了使得乘客等待的时间(电梯在目的层的停靠时刻 - 乘客发出请求时刻)总和最小,请你编写一个程序来进行电梯调度。
本次作业是在上一次的电梯调度的代码上进行改善迭代,不仅加入新的功能,也对程序的输入输出提出了新的要求。
作业要求:
一、 输入从文件读取,输出是写入文件。
大家在学习 C 语言的时候,应该明白了控制台程序的输入和输出。但文件操作往往是之前的课程中被忽略的一个部分,大家有没有试过“如果我要将程序的输出保存下来”、“如果我要从一个文件中获得输入”这些实操的环节呢?如果没有,现在是一个再好不过的学习机会,来吧,learning by doing!
要求:输入输出改成文件输入输出操作。输入文件的文件名为 input.txt
里面保存着输入样例,一个输入为一行,输入的格式见作业的第二条要求。
例如:
0 1 5
2 2 5
程序输出每次对应的决策,每一行的输出格式为 xx时,停靠在x楼
。输出在文件名为output.txt
的文件中。
二、这次的乘客不再像上一次作业那样只会去顶楼或者是 1 楼了,现在要使我们的程序功能更加贴近现实。
迭代:乘客会前往任意一层,请修改程序代码并实现。自然,输入请求就变为了:每个请求一行,格式为 请求时刻 起始楼层数 去往楼层
。同样,大家也需要自己构造测试样例,让这台“电梯”尽可能好的工作。构造五个输入样例,最后输出完成五个请求(所有乘客都到达目的地)后,各乘客的等待时间总和。输入输出的详细例子可以参加上一次作业的要求。
春节的气氛里,磕磕绊绊总算是码完了,这次乘客目的地不是固定的,我看了下之前的代码,呵呵,只能全部推翻重写一个了??
可能还没学到位,也没有那个勇气去码那个最优解,完成的还是跟第二次作业差不多的顺风车版本,有客捡客,逾期不候。
最终提交代码:
version | 行数 | debug数 | 用时 |
---|---|---|---|
initial | 85(117) | 16 | 10h |
second | 120 | 30+ | 18h |
ps:写这种项目太可怕了,各方面都有联系,bug成堆出现
然后测试样例的话就是如下图的五组,取的是各种极端吧,好像还有点重复(我已经被摧残得心志不坚了),有顺路、简单掉头(非刻意省时掉头)、等待、一趟完成几种情况。
输出就如上图 ↑
来说说文件吧,感觉真的是个好东西,尤其是EOF。。。
就看了c++的文件输入输出流,c的没看了
1、流的分类总结
- ofstream :文件的写操作,主要是从内存写入存储设备(如磁盘),它是继承istream类
- ifstream :文件的读操作,主要是从存储设备中读取数据到内存,它是继承了ostream类
- fstream :读写操作,对打开的文件可进行读写操作,它是继承了iostream类。
2、打开文件
打开文件作为我们对文件操作一个最基本操作,它主要就是把我们的类对象和一个文件相关联起来,这样这个被打开的文件就可以用那个类对象表示,之后我们对类对象所做的输入和输出操作其实都是对那个文件所做的操作。
在每个文件流的类中都定义了一个打开文件的成员函数:open,函数原型为:
void open(const char* filename,ios_base::openmode mode);
参数的含义:
filename: 要打开的文件名
mode: 要打开文件的方式
其中mode定义在之前说的所有IO的基类:ios类中,它包括如下几种方式:
ios::app: 以追加的方式打开文件
ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性
ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
ios::in: 文件以输入方式打开(文件数据输入到内存)(ifstream对象默认方式就是这个)
ios::out: 文件以输出方式打开(内存数据输出到文件)(ofstream对象默认的打开方式)
ios::nocreate: 不建立文件,所以文件不存在时打开失败
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
ios::trunc: 如果文件存在,把文件长度设为0
3、关闭文件
当我们完成了对文件的操作后,我们就需要调用函数close来关闭我们的文件流,close函数的作用其实就是清空该类对象的在缓存中的内容并且关闭该类对象和那个文件的关联关系。为了防止一个类对象被销毁后,还和某个文件保留着关联关系,所以文件流类的析构函数都会自动调用close函数。
4、文件读写操作
对于文件读写操作要分两种:
- 二进制文件的读取(暂不介绍)
- 文本文件的读取
对文本文件的读写操作有两种方式:
一种方式是使用输入输出操作符“<<”、“>>”;
另一种方式是使用put、get、getline等函数进行操作。
后者是使用函数,但是这些函数只是能用于处理字符,对于其它数据类型则有些有心无力了,为此还是建议使用第一种方式,因为第一种方式重载了输入输出操作符,它可以处理所有内建数据类型。