90分,第二个点爆了?!

P2010 [NOIP2016 普及组] 回文日期

早右昕 @ 2017-08-16 11:55:21

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
int a[9],b[9],sy,sm,sd,tot;
inline bool comp()
{
    //小前大后
    int temp=a[1]*1000+a[2]*100+a[3]*10+a[4];
    if(temp>sy) return 0;
    if(temp<sy) return 1;
    temp=a[5]*10+a[6];
    if(temp>sm) return 0;
    if(temp<sm) return 1;
    temp=a[7]*10+a[8];
    if(temp>sd) return 0;
    return 1;//相等的时候
}
inline roundyear()
{
    if(!a[4]&&!a[3])//yeartest 
    {
        int temp=a[1]*10+a[2];
        if(temp%4==0) return 1;
        else return 0;
    }
    else
    {
        int temp=a[3]*10+a[4];
        if(temp%4==0) return 1;
        else return 0;
    }
}
inline bool ok()
{
    //monthtest
    int temp=a[5]*10+a[6],daylimit=30;
    if(temp>12||temp==0) return 0;
    if(temp==2)
    {
        daylimit=28;
        if(roundyear()) 
            daylimit=29;
    }//daytest 
    else if(temp==4||temp==6||temp==9||temp==11) daylimit=30;
    else daylimit=31;
    temp=a[7]*10+a[8];
    if(temp>daylimit||temp==0) return 0;
    return 1;
}
int main()
{
//    freopen("date.in","r",stdin);
//    freopen("date.ans","w",stdout);
    bool flag=1;
    for(int i=1; i<=8; i++) scanf("%c",&a[i]),a[i]-='0';
    getchar();
    for(int i=1; i<=8; i++)
    {
        scanf("%c",&b[i]),b[i]-='0';
        if(a[i]!=b[i]) flag=0;
    }getchar();
    if(flag)
    {
        for(int i=1; i<=4; i++) //因为一定保证合法
            if(a[i]!=a[9-i]) flag=0;
        if(flag) printf("1\n");
        else printf("0\n");
        return 0;
    }
    sy=b[1]*1000+b[2]*100+b[3]*10+b[4];
    sm=b[5]*10+b[6];sd=b[7]*10+b[8];//但TM不保证会不会回文 
    int hy=a[1]*1000+a[2]*100+a[3]*10+a[4];
    int hm=a[5]*10+a[6],hd=a[7]*10+a[8];
    for(int i=1; i<=4; i++)
            a[9-i]=a[i];//copy
    int om=a[5]*10+a[6],od=a[7]*10+a[8];
    if(om<=hm&&od<=hd) tot++;    
    while(comp())
    {
        if(ok()) tot++;
        a[4]++;
        a[3]+=a[4]/10;
        a[4]%=10;
        a[2]+=a[3]/10;
        a[3]%=10;
        a[1]+=a[2]/10;
        a[2]%=10;
        for(int i=1; i<=4; i++)
            a[9-i]=a[i];//copy
    }
    printf("%d\n",tot);
}

|