🌟模拟 + 年份判断
🍎解题思路
1.首先枚举所有的日期,特殊判断所有的日期,符合日期定义的继续进行判断
2.首先记录第一个回文日期,之后开始寻找 ABABBABA
型的日期,找到后者之后,结束循环
3.输出两个回文日期即可
$Ps:$虽说上界是89991231,但测试用例有比这大的hh,所以改成死循环了,直到找到两个答案为止
🍭技巧
1.把to_string删了,统一用int处理,TLE顺利解决了,舒服😌
2.WA很多次,你就能优化到极致了hh
🍇时间复杂度
$O(N)$
#include<iostream>
#include<algorithm>
using namespace std;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //对应每个月份的天数
bool isDate(int time)
{
int year = time / 10000, month = time % 10000 / 100, day = time % 100; //获取年份 月份 时间
if(month < 0 || month > 12) return 0;
if(month != 2 && (day < 0 || day > days[month]) ) return 0;
if(month == 2)
{
int leap = year % 4 == 0 && year % 100 || year % 400 == 0;
if(day + leap > 29) return 0;
}
return 1; //是合法日期
}
bool check(int x, bool flag)
{
int t = 0;
for(int i = 0; i < 4; i++)
{
t = t * 10 + x % 10;
x /= 10;
}
return flag == 1 ? t == x : t == x && (t/100 == t%100) && (t % 100/10 != t%10);
}
int main()
{
int n;
scanf("%d", &n);
int ans1 = 0, ans2 = 0; //分别记录第一个回文日期 & ABABBABA
bool flag = 0;
for(int i = n + 1; ; i++)
{
if(ans2 != 0)
break;
if(isDate(i))
{
if(check(i, 1))
{
if(!flag)
{
ans1 = i;
flag = 1;
}
if(flag && check(i, 0))
ans2 = i;
}
}
}
printf("%d\n%d", ans1, ans2);
return 0;
}