2021年蓝桥杯省赛Python A组题目解析

一.填空题

1.卡片

n = []
for i in range(0, 10):
    n.append(2021)

num = 1
ans = 0
while True:
    b = list(map(int, str(num)))    
    for i in b:
        n[i] -= 1
        if n[i] < 0:
            ans = num - 1
            break
    if ans != 0:
        break;
    else:
        num += 1
print(ans)

3.货物摆放

n = 2021041820210418
a = []
for i in range(1, int(n ** 0.5) + 1):
    if n % i == 0:
        a.append(i)
        a.append(n/i)
p = set(a)
ans = 0
for i in p:
    for j in p:
        for k in p:
            if i * j * k == n:
                ans += 1
print(ans)

4.路径

//迪杰斯特拉算法

def minBei(x, y):
    if x == 0 or y == 0:
        return 0
    x1, y1 = x, y
    while y1:
        x1, y1 = y1, x1 % y1
    return x * y // x1


maxL = float('inf')

n = 2021
a = [[maxL for _ in range(n+1)] for _ in range(n+1)]
for i in range(1, n+1):
    for j in range(i, n+1):
        if -21 <= i-j <= 21:
            a[j][i] = a[i][j] = minBei(i, j)
p = [a[1][i] for i in range(n+1)]
sign = [False for _ in range(n+1)]
for i in range(1, n+1):
    x = 0
    m = maxL
    for j in range(1, n+1):
        if (not sign[j]) and p[j] < m:
                m = p[j]
                x = j
    sign[x] = True
    if x == 2021:
        break
    for j in range(1, n+1):
        if not sign[j]:
            p[j] = min(p[x] + a[x][j], p[j])
print(p[n])

//弗洛伊德算法(Floyd)

import math
maxL = float('inf')


def minBei(x, y):
    if x == 0 or y == 0:
        return 0
    x1, y1 = x, y
    while y1:
        x1, y1 = y1, x1 % y1
    return x * y // x1


n = 2021
a = [[maxL] * 2022 for i in range(2022)]
for i in range(1, 2022):
    for j in range(1, 2022):
        if abs(i-j) <= 21:
            a[i][j] = minBei(i, j)
for k in range(2, n + 1):
    for i in range(2, n + 1):
        a[1][i] = min(a[1][i], a[1][k] + a[k][i])
print(a[1][2021])
import math

def gcm(x, y):
    return x*y//math.gcd(x, y)

n = 2021
dp = [float('inf') for _ in range(n + 1)]
dp[1] = 0
for i in range(1, n+1):
    for j in range(i+1, i+22):
        if j > n:
            break
        dp[j] = min(dp[j], dp[i]+gcm(i, j))
print(dp[n])




5.回路

F:

n = int(input())
n = n // 1000
n %= 24*60*60
s = n%60
n //= 60
m = n%60
n //= 60
h = n
print("{:02d}:{:02d}:{:02d}".format(h,m,s))

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值