A. 回文时间
单点时限: 1.0 sec
内存限制: 512 MB
Cuber QQ 很惊奇地发现 2020 年 1 月 22 日的 10:02:02 构成的字符串竟然是一个回文串。(构成的字符串是 20200122100202 ),这下又有充足的理由约女神吃饭了。
可是这之后,女神开始为难 Cuber QQ 了。她现在只允许 Cuber QQ 在回文时间约她吃饭。
回文时间指的是,年份(四位数字构成)+月份(两位数字构成)+日期(两位数字构成)+小时(两位数字构成)+分钟(两位数字构成)+秒(两位数字构成)所形成的字符串是一个回文字符串。其中时间的表示形式是 24 小时制,例如下午 01:02 表示为 13:02 。
于是 Cuber QQ 开始期待之后的约会了。他现在想知道 2020 年 1 月 22 日的 10:02:02 之后第 k 个回文时间是多少(特别地,之后第 0 个回文时间就是 20200122100202 )。
保证他们约会的时间不可能晚于 9999 年 12 月 31 日的 23:59:59 。
输入格式
输入数据包含一行一个整数 k ,表示要求的是之后的第 k 个回文时间。
保证对于给定的输入,输出的答案不会大于 99991231235959 ,即晚于 9999 年 12 月 31 日的 23:59:59 。
输出格式
输出一行一个字符串表示答案。
样例
Input
0
Output
20200122100202
Input
2
Output
20200222200202
这道题只需要考虑年月日的改变就可以了,找出各个的可能取值,直接暴力便利就可以了。
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int k0;
cin>>k0;
string a[100]={"11","22"};//日
string b[100]={"01","02","10","11","12"};//月
string c[100]={//年的后两位
"00","01","02","03","04","05",
"10","11","12","13","14","15",
"20","21","22","23","24","25",
"30","31","32","33","34","35",
"40","41","42","43","44","45",
"50","51","52","53","54","55",
"60","61","62","63","64","65",
"70","71","72","73","74","75",
"80","81","82","83","84","85",
"90","91","92","93","94","95"
};
string d[100]={//年的前两位可能取值
"20","21","22","23","24","25",
"30","31","32","33","34","35",
"40","41","42","43","44","45",
"50","51","52","53","54","55",
"60","61","62","63","64","65",
"70","71","72","73","74","75",
"80","81","82","83","84","85",
"90","91","92","93","94","95"
};
int ans=0;
string str0="20200122100202";
if(k0==0)
{
cout<<str0<<endl;
return 0;
}
string s1="20200111100202";
for(int i=0;i<48;i++)
{
for(int j=0;j<60;j++)
{
for(int k=0;k<5;k++)
{
for(int s=0;s<2;s++)
{
if(i==0&&j<12)//去除不可能出现的情况
continue;
string str2="";
string str=d[i]+c[j]+b[k];
str2+=str;
str2+=a[s];
reverse(str.begin(),str.end());
str2+=str;
if(str2==str0||str2==s1)//去重
continue;
ans++;
if(ans==k0)
{
cout<<str2<<endl;
return 0;
}
}
}
}
}
}