第十四届蓝桥杯省赛A组

试题A:特殊日期

题解

mon = [0,31,28,31,30,31,30,31,31,30,31,30,31]
def run(x):  #判断是否为闰年
    if x%400==0 or (x%4==0 and x%100!=0):
        return True
    return False
res = 0
for year in range(2000,2000000):
    if run(year):#如果是闰年,2月有29天
        mon[2]=29
    else:
        mon[2]=28
    for mm in range(1,13):#1月到12月
        for dd in range(1,mon[mm]+1):#从1号到这个月的最后一天
            if year%mm==0 and year%dd==0:
                res += 1
print(res+1)  #前面只迭代到了1999999年12月31日,最后2000000年1月1日也是一个答案
  • 答案:35813063

试题B:分糖果

详情见

试题C:三国游戏

详情见

试题D:平均

详情见

试题E:翻转

详情见

试题F:子矩阵

题解:暴力

# 读取输入
n, m, a, b = map(int, input().split())
# 创建二维矩阵并读取输入
g = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
    g[i][1:] = map(int, input().split())
# 模数和无穷大定义
MOD = 998244353
INF = int(2e9)
# 初始化结果
ans = 0
# 遍历每个子矩阵的起始点
for i in range(1, n + 1):
    for j in range(1, m + 1):
        # 如果子矩阵的结束点超出了矩阵范围,则跳过
        if i + a - 1 > n or j + b - 1 > m:
            continue
        # 初始化最大值和最小值
        mn, mx = INF, 0
        # 遍历子矩阵的每个元素
        for x in range(i, i + a):
            for y in range(j, j + b):
                # 更新最小值和最大值
                mn = min(mn, g[x][y])
                mx = max(mx, g[x][y])
        # 将最大值和最小值的乘积累加到结果中,并取模
        ans = (ans + mx * mn) % MOD
# 输出结果
print(ans)
  • 45分

试题G:阶乘的和

题解

n = int(input())  # 获取输入的元素个数
a = list(map(int, input().split()))  # 获取输入的元素列表,并转换为整数类型
a.sort()  # 对元素列表进行排序
st, i, cnt = a[0], 0, 0  # 初始化变量st为最小元素,i为索引,cnt为计数器
while i < n:  # 外层循环,遍历元素列表
    while i < n and a[i] == st:  # 内层循环,统计当前元素st的计数
        cnt += 1  # 计数器加1
        i += 1  # 索引加1,继续遍历下一个元素
    if cnt and cnt % (st + 1) == 0:  # 如果计数不为0且计数是(st+1)的倍数
        cnt, st = cnt // (st + 1), st + 1  # 更新计数和最小元素
        if i == n:  # 如果遍历完所有元素
            while cnt and cnt % (st + 1) == 0:  # 继续判断计数是否满足条件
                cnt, st = cnt // (st + 1), st + 1  # 更新计数和最小元素
    else:
        break  # 如果计数不满足条件,或者在遍历完元素之前遇到不符合条件的情况,跳出循环
print(st)  # 输出最小元素st,即为符合条件的结果

试题H:奇怪的数

思路:在长度为n的数中筛选出奇数位为奇数,偶为偶的数;遍历这些数,如果每位求和不大于m,count++,最后输出count
如果遍历筛肯定会爆时间,较好的办法是构建一棵树,每一层的值是可选的奇数或者偶数,只需要遍历这棵树就可以拿到所有值

  • 正解:数位dp
  • 未理解,可参考下文解答
    解答
posted @ 2024-04-07 20:24  Frommoon  阅读(23)  评论(0编辑  收藏  举报