第十二届蓝桥杯编程题

试题F:时间显示

1秒=1000毫秒
1分=60秒=100060=60000毫秒
1小时=60分=60000
60=3600000毫秒
1天=24小时=360000024=86400000毫秒
1年=86400000
365=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])  # 输出根节点的贡献值

试题I:异或数列

法一、博弈论

试题J:括号序列

法一、动态规划

posted @ 2024-03-11 11:25  Frommoon  阅读(26)  评论(0编辑  收藏  举报