当前位置:   article > 正文

第十二届蓝桥杯省赛Python A组部分答案_用python试题 历届真题 分果果【第十二届】【省赛】【a组】

用python试题 历届真题 分果果【第十二届】【省赛】【a组】

自己最近做了一遍,只会做其中的部分题目,想分享一下。

试题A:卡片

小蓝有很多数字卡片,每张卡片上都是数字0 到9。
小蓝准备用这些卡片来拼一些数,他想从1 开始拼出正整数,每拼一个,
就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从1 拼到多少。
例如,当小蓝有30 张卡片,其中0 到9 各3 张,则小蓝可以拼出1 到10,
但是拼11 时卡片1 已经只有一张了,不够拼出11。
现在小蓝手里有0 到9 的卡片各2021 张,共20210 张,请问小蓝可以从1
拼到多少?
提示:建议使用计算机编程解决问题。
自己的理解,这道题1用的最多,只需要把数字1用完就可以了。

答案 3181

ans=0
for i in range(1,3182):
    for j in str(i):
        if j=="1":
            ans+=1
print(ans)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

试题C:货物摆放

小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝
规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、
宽、高。
小蓝希望所有的货物最终摆成一个大的立方体。即在长、宽、高的方向上
分别堆L、W、H 的货物,满足 n = L ∗ W ∗ H n=L*W*H n=LWH
给定n,请问有多少种堆放货物的方案满足要求。
例如,当n = 4 时,有以下6 种方案: 1 ∗ 1 ∗ 4 1*1*4 114 1 ∗ 2 ∗ 2 1*2*2 122 1 ∗ 4 ∗ 1 1*4*1 141 2 ∗ 1 ∗ 2 2*1*2 212 2 ∗ 2 ∗ 1 2*2*1 221 4 ∗ 1 ∗ 1 4*1*1 411
请问,当n = 2021041820210418 (注意有16 位数字)时,总共有多少种
方案?
提示:建议使用计算机编程解决问题。

最开始,我用的暴力法,直接遍历所有情况。然后运行不出来,借鉴别人的思想,进行改进。

ll = set()
for i in range(1, 2021041820210419):
    for j in range(1, 2021041820210419):
        for m in range(1, 2021041820210419):
            if i * j * m == 2021041820210418:
                ll.add((i, j, m))
print(len(ll))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
from math import sqrt

ll = []
temp = 2021041820210418
mm = int(sqrt(temp))
for i in range(1, mm + 1):
    if temp % i == 0:
        ll.append(i)
        ll.append(temp / i)
s = set()
for i in range(len(ll)):
    for j in range(len(ll)):
        for m in range(len(ll)):
            if ll[i] * ll[j] * ll[m] == temp:
                s.add((ll[i], ll[j], ll[m]))
print(len(s))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

试题D:路径

小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图
中的最短路径。
小蓝的图由2021 个结点组成,依次编号1 至2021。
对于两个不同的结点a, b,如果a 和b 的差的绝对值大于21,则两个结点
之间没有边相连;如果a 和b 的差的绝对值小于等于21,则两个点之间有一条
长度为a 和b 的最小公倍数的无向边相连。
例如:结点1 和结点23 之间没有边相连;结点3 和结点24 之间有一条无
向边,长度为24;结点15 和结点25 之间有一条无向边,长度为75。
请计算,结点1 和结点2021 之间的最短路径长度是多少。
提示:建议使用计算机编程解决问题。

运行时间很长,但是能运行出来。

#计算公约数
def gcd(a, b):
    if (b == 0):
        return a
    else:
        return gcd(b, a % b)


# 计算公倍数
def gbs(a, b):
    return a / gcd(a, b) * b


# 最短路径算法
mp = [[0] * 3000 for i in range(3000)]

inf = 999999999999999999999999999999
for i in range(1, 2022):
    for j in range(i, 2022):
        mp[i][j] = mp[j][i] = inf

for i in range(1, 2022):
    for j in range(i, 2022):
        if j - i <= 21:
            mp[i][j] = mp[j][i] = gbs(i, j)

for i in range(1, 2022):
    for j in range(1, 2022):
        for k in range(1, 2022):
            if mp[i][k] + mp[k][j] < mp[i][j]:
                mp[i][j] = mp[j][i] = mp[i][k] + mp[k][j]

print(mp[2021][1])

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

试题F:时间显示

小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取
了当前的时间,用一个整数表示,值为从1970 年1 月1 日00:00:00 到当前时
刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要
显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。

n = int(input())
h, m, s = 0, 0, 0

h = int((n / (1000 * 60 * 60)) % 24)
m = int((n / (1000 * 60) % 60))
s = int((n / 1000) % 60)

if h < 10:
    h = "0" + str(h)
else:
    h = str(h)
if m < 10:
    m = "0" + str(m)
else:
    m = str(m)
if s < 10:
    s = "0" + str(s)
else:
    s = str(s)
print(h + ":" + m + ":" + s)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

试题G:杨辉三角

在这里插入图片描述

ll = [[1], [1, 1]]
N = int(input())

for i in range(2, 800):
    sump = ll[-1]
    cur = [1]
    for j in range(i - 1):
        cur.append(sump[j] + sump[j + 1])
    cur.append(1)
    # print(cur)
    ll.append(cur)

print(ll)
mm = []
index=0
for i in range(800):
    for j in range(i+1):
        mm.append(ll[i][j])

for i in range(len(mm)):
    if mm[i]==N:
        index=i+1
        break

print(index)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

试题J:括号序列

在这里插入图片描述

from itertools import permutations


def chkParenthesis(A, n):
    if n % 2 != 0:
        return False
    i = 0
    count = 0
    while i < n:
        if A[i] == '(':
            count += 1
        elif A[i] == ')':
            count -= 1
        else:
            return False
        if count < 0:
            return False
        i += 1
    if count == 0:
        return True
    return False


kuohao = input("")
# print(chkParenthesis(kuohao,len(kuohao)))
left, right = 0, 0
for i in range(len(kuohao)):
    if kuohao[i] == "(":
        left += 1
    if kuohao[i] == ")":
        right += 1
if left < right:
    left = right
else:
    right = left

mm = []
for i in range(left):
    mm.append("(")
    mm.append(")")

# print(mm)
ll = list(set(permutations(mm)))

ans = 0
for i in range(len(ll)):
    if chkParenthesis(ll[i], len(ll[i])):
        ans += 1
print(ans % 1000000007)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/511015
推荐阅读
相关标签
  

闽ICP备14008679号