第十二届蓝桥杯编程题
试题F:时间显示
1秒=1000毫秒
1分=60秒=100060=60000毫秒
1小时=60分=6000060=3600000毫秒
1天=24小时=360000024=86400000毫秒
1年=86400000365=31536000000毫秒
题解
#把当前时间依次除以年,日,时,分,秒
n=int(input())#获取输入
n=n%31536000000#先看看多少年,只保留余数
n=n%86400000#余上天,只保留余数
h=n//3600000#除以小时,存在h中
n=n%3600000#拿到除去小时后的余数
m=n//60000#除以分,存在m中
n=n%60000#拿到除去分后的余数
s=n//1000#除以秒,存在s中
print('{:02d}:{:02d}:{:02d}'.format(h,m,s))#: 表示格式化字符串的开始。0 表示使用零进行填充。2 表示字段的宽度为2个字符。d 表示输出的值是一个十进制整数。
试题G:杨辉三角形
法一、暴力
- 思路:直接用一个二维数组把杨辉三角存进去,遍历数组,不是目标值计数器++,找到目标值输出计数值
n = 1000#两个for循环10^6,题目是10^9,10000时爆了
a = [[0] * (n+1) for _ in range(n+1)]#初始化二维数组
a[1][1] = 1#第一个元素
for i in range(2, n+1): # 预处理
for j in range(1, i+1):
a[i][j] = a[i - 1][j] + a[i - 1][j - 1]#从第二行开始,用定义填入每一个值
x = int(input())#获取读入的数
cnt = 0
for i in range(1, n+1): # 枚举
for j in range(1, i+1):
cnt += 1
if a[i][j] == x:
print(cnt)
exti(0)#终止程序
- 49分
法二、公式
n=int(input())#获取输入
num=n*(2+(n-1))//2+2#等差数列求和公式:Sn=(n/2)*(2a1+(n-1)d),其中a1=1,d=1,num表示当前元素的位置,第一行一个第二行2个,行是一个等差数列,处理了行还要加上当前行前面的元素,经过观察大部分元素在第二个位置,+2可以包含的结果多一些
# num=n*(n+1)//2+2#同样的等差数列
print(num)
- 45分
法三、结合上者
n = 1000
a = [[0] * (n+1) for _ in range(n+1)]#初始化二维数组
x = int(input())#获取读入的数
# 如果 x 大于 等差数列前 n 项的和,则直接使用等差数列求和公式计算结果并打印输出
if x > n * (n + 1) // 2:
result = x * (x + 1) // 2 + 2
print(result)
exit(0)
# 构建杨辉三角形
a[1][1] = 1
for i in range(2, n+1):
for j in range(1, i+1):
a[i][j] = a[i-1][j] + a[i-1][j-1]
cnt = 0
# 在杨辉三角形中搜索目标数 x
for i in range(1, n+1):
for j in range(1, i+1):
cnt += 1
if a[i][j] == x:
# 找到目标数 x,打印计数器 cnt 的值并退出程序
print(cnt)
exit(0)
- 82分
试题H:左孩子右兄弟
题解:树型dp
def dfs(u):
cnt = 0 # 儿子数量
mx = 0 # 最大贡献值
for i in g[u]: # 遍历节点 u 的儿子节点
dfs(i) # 递归调用深度优先搜索
cnt += 1 # 统计儿子数量
mx = max(mx, dp[i]) # 更新最大贡献值
dp[u] = mx + cnt # 计算当前节点的贡献值,即最大贡献值加上儿子数量
n = int(input()) # 输入节点数目
dp = [0] * (n + 1) # 初始化 dp 列表
g = [[] for _ in range(n + 1)] # 初始化图 g
for i in range(2, n + 1):
tmp = int(input())
g[tmp].append(i) # 将节点 i 添加到父节点 tmp 的儿子列表中
dfs(1) # 从根节点 1 开始进行深度优先搜索
print(dp[1]) # 输出根节点的贡献值