算法---poj 1209
地址:http://这题是模拟题,大悲催啊~,被卡个半死,花了三天,查资料,编码,结果运行,竟然不出结果。
于是又去UVA的论坛查找,看到有人话费好大力气还用链表写,这是不敢恭维~。在百度上查了一个自称ac的了,到uva上还是wa,在poj上测试下竟然能过~~~,我先去研究他的代码去了。
在网上还看到一种思路,但是对于第二次输入'D'的那个不太理解~~~,思路如下:
1)输入年份year,计算year是否是闰年;
2)反复处理输入输出信息,直至输入'#'为止。
若输入周年纪念日标志'A',则累计周年纪念日数n,输入第n个周年纪念的日期(e[n].month,e[n].day)、重要性参数e[n].level、描述事件的字符串e[n].a、输入次序e[n].index=n。
若输入服务标志'D',分两种情况处理:
1)若第1次输入'D',则按照周年纪念的日期为第1关键字、重要性参数为第2关键字、输入次序为第3关键字的递增顺序排列事件序列e[1..n]。
2)若非第1次输入'D',则首先读服务日期(month,day),并将日期计数器cnt初始化为
-1,然后进入循环,直至cnt到达提醒天数的上限7为止:
若为当天服务(cnt= -1),则将e序列中周年纪念日期为(month,day)的事件存储在s中,按照输入次序递增的顺序重新排列s,然后以重要性参数为*TODAY*的名义依次输出s中事件的日期和描述事件的字符串。
若非当天服务(cnt≠-1),则依次寻找e序列中周年纪念日期为(month,day)的事件e[i](e[i].month == month && e[i].day == day,1≤i≤n),计算该事件剩余的提醒时间num=e[i].level-cnt。若num≤0,则说明该事件已过提醒时间;否则输出服务标识(num个'*'和8-num个空格)和描述事件的字符串e[i].a。
累计过去的天数(cnt++)。若过了提醒期限(cnt == 7),则退出循环;否则获取month月day日的下一天日期(month,day)。
算法高手能不能讲解讲解,或者是有更好的方法。。。