寒假Day4:
EOJ Monthly 2020.1
A.回文时间
- 题面:
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
- 这是我的错误的代码。
题解说是模拟题,过了样例,没看出来哪错了。。
我的思路:对于年份,把2020单独拿出来判断。其余数字进行两两进行范围判断,倒过来也必须是在时间范围之内0-59;
中间部分六位数只能在01 11 10、01 22 10、02 11 20、02 22 20里面选择,把它倒过来想一下就知道为什么只能在这四种条件里面进行取余判断了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int a[8000]; 5 int x; 6 void init() 7 { 8 x=1; 9 for(int i=2021; i<=9595; i++) 10 { 11 int q=i%10*10+i/10%10; 12 int h=i/100%10*10+i/1000; 13 if(q>=0&&q<=59&&h>=0&&h<=59) 14 a[x++]=i; 15 } 16 } 17 18 int main() 19 { 20 init(); 21 int k; 22 while(~scanf("%d",&k)) 23 { 24 if(k==0) 25 printf("20200122100202\n"); 26 else if(k==1) 27 printf("20200211200202\n"); 28 else if(k==2) 29 printf("20200222200202\n"); 30 else 31 { 32 int w,y; 33 if(k<=2) 34 printf("2020"); 35 else 36 { 37 w=(k-2)/4; 38 if((k-2)%4!=0) 39 w+=1; 40 y=a[w]; 41 printf("%d",y); 42 } 43 w=(k-2)%4; 44 if(w==1) 45 printf("011110"); 46 else if(w==2) 47 printf("012210"); 48 else if(w==3) 49 printf("021120"); 50 else if(w==0) 51 printf("022220"); 52 if(k<=2) 53 printf("0202"); 54 else 55 { 56 int b[5],o=0; 57 while(y) 58 { 59 b[o++]=y%10; 60 y/=10; 61 } 62 for(int i=0; i<o; i++) 63 printf("%d",b[i]); 64 printf("\n"); 65 } 66 } 67 } 68 return 0; 69 }
TO DO LIST:
- w 50+
- EOJ*1
- cfs*2