64分,4个WA......

P2010 [NOIP2016 普及组] 回文日期

MiPoint @ 2021-08-28 12:04:38

4个WA......

看不出来哪里错了(没有TLE就很让人迷啊啊),求大佬帮忙看看啊

思路是枚举每一天找到所有回文日期

#include<bits/stdc++.h>
using namespace std;

int st,et;
int dates[100005],dateCnt;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool isr(int);
bool isrn(int);
void getYearEveryDay(int);
void getMonthEveryDay(int,int);
void getDaysInAMonth(int,int,int,int);
void getdates(int,int);
int getr(int,int);

bool isr(int t){//是否是回文 
    int l=0,dt[10]={0};
    while(t){
        dt[l++]=t%10;
        t/=10;
    }
    for(int i = 0;i<l/2;i++)if(dt[i]!=dt[l-1-i])return false;
    return true;
}

bool isrn(int t){//是否是闰年 
    if(t%4!=0)return false;
    if(t%100==0&&t%400!=0)return false;
    return true;
}

void getYearEveryDay(int yy){//获取一年里每一天 
    for(int i = 1;i<=12;i++)getMonthEveryDay(yy,i);
}

void getMonthEveryDay(int yy,int mm){//获取一个月里每一天 
    if(isrn(yy)&&mm==2){
        for(int i = 1;i<=29;i++){
            dateCnt++;
            dates[dateCnt]=yy*10000+mm*100+i;
        }
    }
    else{
        for(int i = 1;i<=days[mm];i++){
            dateCnt++;
            dates[dateCnt]=yy*10000+mm*100+i;
        }
    }
}

void getDaysInAMonth(int yy,int mm,int stdd,int etdd){//获取月内的某一段时间 
    for(int i = stdd;i<=etdd;i++){
        dateCnt++;
        dates[dateCnt]=yy*10000+mm*100+i;
    }
}

void getdates(int st,int et){
    int dt[10]={0};
    int l=0;
    while(st){//分解开始时间日期 
        dt[l++]=st%10;
        st/=10;
    }
    int styy=dt[7]*1000+dt[6]*100+dt[5]*10+dt[4];
    int stmm=dt[3]*10+dt[2];
    int stdd=dt[1]*10+dt[0];

    l=0;
    dt[10]={0};
    while(st){//分解结束时间日期 
        dt[l++]=st%10;
        st/=10;
    }
    int etyy=dt[7]*1000+dt[6]*100+dt[5]*10+dt[4];
    int etmm=dt[3]*10+dt[2];
    int etdd=dt[1]*10+dt[0];

    //分解年份的日期
    for(int i = styy+1;i<=etyy-1;i++){
        getYearEveryDay(i);
    }
    //分解月份的日期
    bool f=0;
    if(styy==etyy)f=1;//在一年以内
    if(f){
        for(int i = stmm+1;i<=etmm-1;i++){
            getMonthEveryDay(styy,i);
        }
    }
    else{
        for(int i = stmm+1;i<=12-1;i++){
            getMonthEveryDay(styy,i);
        }
        for(int i = 1;i<=etmm-1;i++){
            getMonthEveryDay(etyy,i);
        }
    }
    //分解一个月以内的每一天
    bool fg=0;
    if(styy==etyy&&stmm==etmm)fg=1;//在一月以内
    if(f){
        getDaysInAMonth(styy,stmm,stdd,etdd);
    }
    else{
        if(isrn(styy)&&stmm==2)getDaysInAMonth(styy,stmm,stdd,29);
        else getDaysInAMonth(styy,stmm,stdd,days[stmm]);

        getDaysInAMonth(etyy,etmm,1,etdd);
    }
}

int getr(int st,int et){//获取指定范围内的每一天 
    int cnt=0;
    getdates(st,et);
    for(int i = 1;i<=dateCnt;i++){
        if(isr(dates[i]))cnt++;
    }
    return cnt;
}

int main(){
    cin>>st>>et;
    cout<<getr(st,et);
    return 0;
} 

|