64分,4个WA......
查看原帖
64分,4个WA......
491194
MiPoint楼主2021/8/28 12:04

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;
} 
2021/8/28 12:04
加载中...