【NOIP2016普及组】 second 枚举 date

来源:互联网 发布:阿里巴巴淘宝城四期 编辑:程序博客网 时间:2024/06/05 07:51

    由于各种各样的缘故,题目无法放上来,看看洛谷里的原题目吧……


    NOIP2016普及组-回文日期-洛谷


    这道题乍一看就觉得很简单,非常容易就能想到用枚举即可,但是还是有几丝顾虑——一天一天枚举会不会爆?我也如此想着,所以想到了一个机(zuo)智(si)的方法——一年一年加(一年最多只会有一个回文),判断合法性即可。如:

    什么某年的回文月份与日份不匹配(13200231),月份日份明显超标或不达标(20000002,53100135)(闰年什么的怎么可能不考虑……)

    然后我突然发现一个问题:比如说这种数据——2011 01 01~2011 11 01(为方便你们打上空格),这样只有一年,而这年的回文是2011 11 02,虽然合法,但不在区间内,也不能算。所以就多花一点时间判断一下吧!我这么想……

    但是现实打击了我,我只判断了结束年是否合法,忘记了判断开始年,所以——

    2010 01 01~2011 11 01

    只有一个回文——2010 01 02,而我却会有两个——2010 01 02和2011 11 02

    哭晕在厕所……

    不过呢——由于民间数据太水,我的程序还是AC了,不过官方数据应该会有坑我的那种……只能自求多福了……

    就知道你们会要代码:

#include<cstdio>int s1,s2;int day[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};int sy,sm,sd,ey,em,ed,sum;int f(int a){return a%10*10+a/10;}int r(){if(sm!=2)return 0;elsereturn (sy%4==0&&sy%100)||sy%400==0;}int main(){scanf("%d%d",&s1,&s2);sy=s1/10000;sm=s1/100%100;sd=s1%100;ey=s2/10000;em=s2/100%100;ed=s2%100;for(;sy<ey||(sy==ey&&sm<em)||(sy==ey&&sm==em&&sd<=ed);sd++){if(sd>r()+day[sm]){sd=1;sm++;}if(sm>12){sm=1;sy++;}if(f(sd)*100+f(sm)==sy){sum++;}}printf("%d",sum);}


1 0