LQ0140 特殊时间枚举

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0140 特殊时间枚举相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2022初赛 C++ C组D题

题目描述
2022 年 2 月 22 日22:20 是一个很有意义的时间,年份为2022,由 3 个 2 和 1 个0 组成。
如果将月和日写成 4 位,为0222,也是由 3 个 2 和 1 个 0 组成。
如果将时间中的时和分写成 4 位,还是由 3 个 2 和 1 个 0 组成。
小蓝对这样的时间很感兴趣,他还找到了其它类似的例子,比如111 年10月11 日01:11,2202 年2 月22 日22:02 等等。
请问,总共有多少个时间是这种年份写成 4 位、月日写成 4 位、时间写成 4 位后,
均由 3 个一种数字和 1 个另一种数字组成。
注意1111 年11 月11 日11:11不算,因为它里面没有两种数字。
注意:1112年11月10日11:11也不算,总共出现了三种数字。
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。

问题分析
枚举2个数字再进行合法性判定。
通过组合来减少计算复杂度。

AC的C语言程序如下:

/* LQ0140 特殊时间 */

#include <stdio.h>

int main()

    int cnt = 0;
    for (int d1 = 0; d1 <= 9; d1++)
        for (int d2 = 0; d2 <= 9; d2++) 
            if (d2 == d1) continue;
            int ycnt = 0, dcnt = 0, mcnt = 0;
            for (int k = 0; k < 4; k++) 
                int num[4];
                num[k] = d1;
                num[(k + 1) % 4] = num[(k + 2) % 4] = num[(k + 3) % 4] = d2;

                int y = num[0] * 1000 + num[1] * 100 + num[2] * 10 + num[3];
                int m = num[0] * 10 + num[1];
                int d = num[2] * 10 + num[3];
                int hh = m;
                int mm = d;
                if (y > 0) ycnt++;
                if (1 <= m && m <= 12 && 1 <= d && d <= 30)
                    dcnt++;
                if (1 <= hh && hh <= 24 && 0 <= mm && mm < 60)
                    mcnt++;
            
            cnt += ycnt * dcnt * mcnt;
        
    printf("%d\\n", cnt);

    return 0;

以上是关于LQ0140 特殊时间枚举的主要内容,如果未能解决你的问题,请参考以下文章

LQ0018 顺子日期枚举+日期

LQ0150 回文日期枚举

LQ0037 约数个数水题

LQ0073 平面分割递推+数学

LQ0067 星期计算快速模幂

LQ0016 九进制转十进制进制