第十四届蓝桥杯省赛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
- 未理解,可参考下文解答
解答