• 如果您想对本站表示支持,请随手点击一下广告即可~
  • 本站致力于提供原创、优秀的技术文章~
  • 有任何疑问或建议 均可以在站点右侧栏处 通过各种方式联系站长哦~
  • POJ3393 – Lucky and Good Months by Gregorian Calendar

    ACM-POJ EXP 100阅读 0评论

    全解题报告索引目录 -> 【北大ACM – POJ试题分类


    大致题意

    科普文一篇,文章80%都是无用信息,因为都是常识,但是又不得不看,因为有20%是常人不知道的历史常识。


    定义

    Goog month : 该月第一个工作日为星期一的月份

    Luckly month: 该月最后一个工作日为星期五的月份

    问: 给定一个Gregorian Calendar格里高公历的 时间闭区间(就是包括端点的年月了)

    【开始年、月】~【结束年、月】

    在这个时间区间内,有多少个Goog month,有多少个Luckly month


    文章要点

    Gregorian Calendar格里高公历 就是现在广泛使用公历(西历),下面简称GC

    GC的起始日期为 1年1月1号,该日为星期六

    GC平年有365天,闰年366天(2月多1天)

    GC有12个月,各月的天数和现在的使用的西历一致

    GC在1582年之前(不包括1582),若该年份能被4整除,则为闰年

    GC在1582年之后(包括1582),判断闰年的标准(满足下面随便一个):

    (1) 能被4整除,但不能被100整除;

    (2) 能被400整除。

    由于历史原因,GC规定1700年无条件为闰年

    由于历史原因,GC规定1752年9月3日~13日共11天不存在,即1752年9月只有19天

    GC一星期有7天,排序为Sun,Mon,Tue,Wed,Thu,Fri,Sat,和现在的星期一致,其中Mon到Fri为工作日,Sun和Sat为休息日

    解题思路

    直接模拟就OK了,水题

    先做一个判断闰年的函数 leap()

    输入时间区间的 起始年sy月sm 和 终止年ey月em 后

    先计算1年1月到sy年sm-1月(若sm=1,则计算到sy-1年12月)的天数day

    注意此时day的天数刚好计算到sm-1月的最后一天

    若day+1,则恰好进入所输入的时间区间【开始年、月】~【结束年、月】的第一天

    计算day时要注意

    (1) 1582年前后闰年判断标准改变了

    (2) 1700无条件闰年

    (3) 1752年9月少了11天


    判断第day天是星期几

    由于1年1月1号为星期六,一星期有7天,

    因此 (day+5)%7就能计算第day天是星期几。

    不能直接day%7,day%7就是默认1年1月1号为星期日,至于为什么要先+5,这个不难推导,读者自己想想就明白了


    判断某月是不是Good month和Luckly month

    计算天数day后,令day++,进入sm的1号

    此时判断sm的1号是不是为Good month,使用上面给出计算第day天是星期几的方法,若

    1号为星期日(0)、星期六(6)或星期一(1),则该月为Good month

    从sm月开始,把天数day逐月递增,逐月判断该月是否为Good month,判断方法都是一样的。

    不难发现,若第k月为Good month,则第k-1月必定为Luckly month,因此两个计数器同时增加即可。


    注意3点

    (1) 边界:若sm为Good month,计数器good++,但计数器luck不变,因为sm-1月不在时间区间内。 若计算到em为Good month,则计数器luck++,good不变,因为day一开始就+1了,当day逐月递增到em时,实则day此时为第em+1月的1号,此时判断的是em+1月是否为Good month,若是,则第em月为Luckly month,但em+1月在时间区间内,不计入计数器

    (2) 逐月递增时,若到达1752年9月,要 减11天

    (3) 闰年平年的月份天数不同


    转载请注明:EXP 技术分享博客 » POJ3393 – Lucky and Good Months by Gregorian Calendar

    喜欢 (0) 分享 (0)
    发表我的评论
    取消评论

    表情

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址