我之前参加了这场考试,当时没做出来这道题。时隔一个月这题终于放了出来,于是马上再做了一次。不得不说真的很复杂。最终完成之际,决定记录与分享一下我的思路与代码(提交已通过)。
题目的细节还是照旧不贴,但是我大致地描述一下:题目根据一个格式化输入,产生格式化的输出。
输入格式为“配置信息数 系统开始时间(包含) 系统结束时间(不包含)”
时间格式为“yyyymmddHHMM”
配置信息格式为“分钟 小时 日期 月份 星期 命令”,配置信息中的每一项可包含具体数字,英文缩写(不区分大小写),星号(*)表示任何取值,逗号(,)表示多个不同的取值,减号(-)表示区间。
输出格式为“时间 命令”,如果同一时刻有多条命令满足调度条件,则按照输入给出的顺序输出
这道题有两种思路:(1)根据每个时间,判断能执行哪条命令;(2)根据每个命令,判断其运行时间,将其存储在vector中,然后对vector排序并输出。显然前者容易超时,所以我选择了后者。下面进行具体分析。
1、首先考虑数据的存储方式。对于时间,由于输入数据的保证,将其存储为数字也可以在输出时不出现问题,并且可以使得处理更加方便,所以时间用long long(我在程序中定义为LL)存储。而配置信息的每个项很显然要用字符串存储了。至于存储“时间 命令”对的数据结构,由于同一时刻可能对应多条命令,并且此时要按照输入顺序输出,而不是命令的字母表顺序。所以不可以使用map,而只能用vector<pair<LL, int> >来存储“时间 序号”对,然后输出时把序号换成对应的命令。
2、接下来是程序的流程。很明显关键的一步是如何根据配置信息的各个项