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 特殊时间枚举的主要内容,如果未能解决你的问题,请参考以下文章