题解 CF108A 【Palindromic Times】

· · 题解

Content

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

数据范围: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;
}