(一)题面:
样例输入
3 201711170032 201711222352
0 7 * * 1,3-5 get_up
30 23 * * Sat,Sun go_to_bed
15 12,18 * * * have_dinner
样例输出
201711170700 get_up
201711171215 have_dinner
201711171815 have_dinner
201711181215 have_dinner
201711181815 have_dinner
201711182330 go_to_bed
201711191215 have_dinner
201711191815 have_dinner
201711192330 go_to_bed
201711200700 get_up
201711201215 have_dinner
201711201815 have_dinner
201711211215 have_dinner
201711211815 have_dinner
201711220700 get_up
201711221215 have_dinner
201711221815 have_dinner
(二)题目大意:
其实题目说得算是比较清楚了,就是给定你一些事件发生得时间,然后给出一个时间范围,让你顺序输出这段时间内会发生得时间。只不过这里给出得事件发生的时间有一点麻烦而已。
(三)解题思路:
1.大致的思路有两种:
①把所有的简写的时间给全部列出来(比如某事件会在星期三、四、五发生,那么我就添加三个事件),然后对所有的时间进行排序,然后顺序输出即可。
②在给定的时间范围内,依次判断每一分钟是否会有事件发生,将发生的事件输出。
2.我们分析对比一下两种方法:
①对于第一种方法而言,由于输出不会超过10000行,说明将会发生的事件不会超过10000个,如果可以将所有会发生的事件给写出来,那么效率将会非常高。但是想一想怎么将一个事件所有的给定时间范围内的各个时间分呢。这个想想貌似不是那么好处理。
②对于第二种方法,如果给定了一个时间,只需要判断每个事件在这个时间点是否会发生就相对简单一些了,因为给定一个确切的时间和时间满足发生条件的时间,我们只要对二者进行对比即可。但是这里有问题是,对时间范围内的所有时间进行判定,这个时间复杂度似乎有点高,考虑一个极限范围:1970-01-01~2099-12-31,总共分钟数为(粗略计算):130*365*24*60=68328000=7e7,再考虑对于每一分钟都需要判断所有的事件(<=20),我们可以粗略地得到运算次数在1.4e9。虽然题目给了十秒钟,但是依然有超时地风险。即使如此,没有想到更好地解决方法,索性就先试试看,不过还好没有超时。
3.这个题目如果在赛场上没有太多的时间思考,那么根据题中测试样例的限定条件去写代码得分,也是一种不错的选择。
(四)具体代码:
#include
#include
#include
#include
#include
(五)总结:理清思路,注意细节。