[HDOJ3403 Palindrome day]暴力

【算法分析】
直接预处理出所有答案。
枚举回文数的前半截。
这样就可以确保升序。
注意判断闰年。
比赛时因为这个闰年的某个判断没AC。= =
【其它】
我真是沙茶。。。
【CODE】
#include #include #include typedef __int64 lld;
const int N=4000000;
int tot,Tc,len,odd;
lld list[4000005];
int L1[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int now,mid,dd,mm,Ed[10];
lld yy;
char ch[100];

inline lld filp(lld x){return x/10+x%10*10;}

void Add(int LL){
if (tot==N) return;
int i,j;
if (len%2==0) j=LL;
else j=LL-1;
while (j>0){
ch[++LL]=ch[j];
j–;
}
yy=dd*100+mm;
for (i=1;i<=LL;i++)
yy=yy*10+ch[i]-‘0’;
if (!((yy%4==0 && yy%100!=0) || yy%400==0))
if (filp(mm)==2 && filp(dd)==29) return;
yy=0;
for (i=1;i<=LL;i++)
yy=yy*10+ch[i]-‘0’;
list[++tot]=yy*10000+mm*100+dd;
}

void Try(){
int LL,i,j;
LL=(len+1)/2;
for (i=1;i<=LL;i++) ch[i]='0';
Add(LL);
if (tot==N) return;
while (1){
i=LL;
while (i>0 && ch[i]==’9′) i–;
if (i==0) return;
for (j=i+1;j<=LL;j++) ch[j]='0';
ch[i]++;
Add(LL);
if (tot==N) return;
}
}

bool can(){
int td=filp(dd),tm=filp(mm);
if (tm<1 || tm>12) return false;
if (td<1 || td>L1[tm]) return false;
return true;
}

void Get(){
for (dd=10;dd<=99;dd++)
for (mm=1;mm<=99;mm++)
if (can())
Try();
}

void init(){
tot=0;
for (len=0;tot Get();
Ed[len]=tot;
}
}

void PUT(lld x,int LL){
if (LL==0) return;
lld tmp=1;
for (int i=1;i while (tmp>0){
printf("%d",(int)(x/tmp%10));
tmp/=10;
}
}

void output(lld x,int LL){
PUT(x%100,2);
PUT(x/100%100,2);
PUT(x/10000,LL);
PUT(filp(x/100%100),2);
PUT(filp(x%100),2);
printf("n");
}

void solve(){
int Tc,x;
scanf("%d",&Tc);
for (int i=1;i<=Tc;i++){
scanf("%d",&x);
int j=0;
while (x>Ed[j]) j++;
output(list[x],j);
}
}

int main(){
init();
solve();
}

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注