CF108A Palindromic Times 题解

Content

现在是 \(h\) 时 \(m\) 分,请求出在此之后(不包含此时)的第一个回文时间。

数据范围:\(0\leqslant h\leqslant 23,0\leqslant m\leqslant 59\)。

Solution

众所周知,回文时间每个小时段最多只有一个,我们来枚举一下:\(00:00,01:10,02:20,03:30,04:40,05:50,10:01,11:11,12:21,13:31,14:41,15:51,20:02,21:12,22:22,23:32\)。就只有以上这 \(16\) 个时间是回文时间,因此,我们一步一步往后推时间,并判断是不是上面的这 \(16\) 个时间就好了。

注意,这里输出时间只有 \(1\) 位的要补足输出,所以我们可以用 \(\texttt{printf}\) 的奇技淫巧—— \(\texttt{\%0xd}\) 输出(其中 \(x\) 代表的是输出的位数,不足这个位数的话自动向前面用 \(0\) 补足,例如下面的 \(\texttt{\%02d}\) 就是按照两位输出,不足两位的话自动向前面用 \(0\) 补足)。

Code

#include <cstdio>
using namespace std;

int main() {
	int h, m;
	scanf("%d:%d", &h, &m);
	while(1) {
		m++;
		if(m > 59)	h++, m = 0;
		if(h > 23)	h = 0;
		if((h == 0 && m == 0) || (h == 1 && m == 10) || (h == 2 && m == 20) || (h == 3 && m == 30) || (h == 4 && m == 40) || (h == 5 && m == 50) || (h == 10 && m == 1) || (h == 11 && m == 11) || (h == 12 && m == 21) || (h == 13 && m == 31) || (h == 14 && m == 41) || (h == 15 && m == 51) || (h == 20 && m == 2) || (h == 21 && m == 12) || (h == 22 && m == 22) || (h == 23 && m == 32))	{
			printf("%02d:%02d", h, m);
			break;
		}
	}
	return 0;
}
上一篇:读书笔记 | 资本的秘密


下一篇:剑指 Offer 22. 链表中倒数第k个节点