0
点赞
收藏
分享

微信扫一扫

蓝桥杯真题--12届

沪钢木子 2022-04-13 阅读 53
python

试题A: 卡片

n = 2021
lst = [0,0,0,0,0,0,0,0,0,0]
count = 1
while True:
    for i in range(len(str(count))):
        lst[eval(str(count)[i])] += 1
    if max(lst)>=2021:
        break
    count+=1
print(lst)
print(count)

lst=[0]*10
flag=False
res=0
while flag==False:
    res+=1
    tmp=str(res)
    for i in range(len(tmp)):
        index=int(tmp[i])
        lst[index]+=1
        if lst[index]==2021:
            flag=True
print(res)

试题B 直线

image-20220405160548583

points=[[x,y] for x in range(20) for y in range(21)]
# 420个组合的点 [[0,0],[0,1]...]
nums=set()
for i in points:
    x1,y1=i[0],i[1]
    for j in points:
        x2,y2=j[0],j[1]
        if x1==x2:  #特殊情况:直线垂直时斜率不存在,先跳过最后计算
            continue
        k=(y2-y1)/(x2-x1)
        b=(x2*y1-x1*y2)/(x2-x1)
        if (k,b) not in nums:
            nums.add((k,b))
print(len(nums)+20)
# https://www.icode9.com/content-1-1322681.html
cnt = 0
dots = [(i, j) for i in range(20) for j in range(21)]  # 生成所有点
lines = set()
for i in range(len(dots)):
    for j in range(i+1, len(dots)):
        if dots[j][0]-dots[i][0] != 0:
            x1, x2 = dots[i][0], dots[j][0]
            y1, y2 = dots[i][1], dots[j][1]
            k = (y2-y1)/(x2-x1)
            b = (y1*(x2-x1)-x1*(y2-y1))/(x2-x1)  # 这么写不会炸精度
            lines.add((k, b))
print(len(lines)+20)

# 40257

货物摆放

小蓝有一个超大的仓库,可以摆放很多货物。

现在,小蓝有 n nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。

小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 L LL、W WW、H HH 的货物,满足 n = L × W × H n = L \times W \times Hn=L×W×H。

给定 n nn,请问有多少种堆放货物的方案满足要求。

例如,当 n = 4 n = 4n=4 时,有以下 6 66 种方案:1 × 1 × 4 、 1 × 2 × 2 、 1 × 4 × 1 、 2 × 1 × 2 、 2 × 2 × 1 、 4 × 1 × 1 1×1×4、1×2×2、1×4×1、2×1×2、2 × 2 × 1、4 × 1 × 11×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1

请问,当 n = 2021041820210418 n = 2021041820210418n=2021041820210418 (注意有 16 1616 位数字)时,总共有多少种方案

#
n=24
counts=0
memory=[]
for i in range(1,int(n**0.5)+1):
    if(n%i==0):
        memory.append(i)
        memory.append(n//i)
        # print(memory)
print(memory)
# [1, 24, 2, 12, 3, 8, 4, 6]
for i in memory:
    for j in memory:
        for k in memory:
            if i*j*k==n:
                counts+=1
                # print(counts)
print(counts)

路径

def cal():# 动态规划
    n=2021
    dp=[float("inf")]*(n+1)
    for i in range(1,22):# 初始化1-21的边相连,且最小公倍数等于其本身
        dp[i]=i
    for i in range(22,n+1): # 对于剩下的结点
        for j in range(1,22): # 距离其结点 21范围以内的距离,肯定有一条边,找最小
            dp[i]=min(dp[i],dp[i-j]+zxgbs(i-j,i))
            # 如果本身的值最小即选择,如果不是,则判断前21个以内,是否有边直连
    print(dp[n])


def zxgbs(a,b):
    # 最小公倍数=两数相乘÷两数的最大公约数
    a1=max(a,b)
    b1=min(a,b)
    while b1:
        a1,b1=b1,a1%b1 # a1是最大公约数
        # 辗转相除法,两个正整数a和b(a>b)
        # 它们的最大公约数等于a除以b的余数c和b之间的最大公约数
    res=a*b//a1
    return res

def zxgbs2(li=[12,6,5,4]): # 多个数的最小公倍数
    while len(li)!=1:
        tmp=zxgbs(li[0],li[1])
        li.remove(li[0])
        li.remove(li[0])
        li.append(tmp)
    return li[0]
    

if __name__=="__main__":
    cal()
    

回路计数

from math import gcd


def cal():  #
    n = int(input())
    m = 1 << n
    # 每一位代表一栋教学楼,为1代表该教学楼已经遍历过,0代表没有遍历过(初始第1位1)
    dp = [[0 for j in range(n)] for i in range(m)]
    load = [[False for j in range(n)] for i in range(n)]
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            if gcd(i, j) == 1:
                load[i - 1][j - 1] = True
    dp[1][0] = 1
    for i in range(1, m):
        for j in range(n):
            if i >> j & 1:
                for k in range(n):
                    if i - (1 << j) >> k & 1 and load[k][j]:
                        dp[i][j] += dp[i - (1 << j)][k]
    print(sum(dp[m - 1]) - dp[m - 1][0])


if __name__ == "__main__":
    cal()

时间显示

import time
##days=24*60*60*1000
#### 因为time模块的单位为秒数,而题目所给的为毫秒数,所以要将题目所给的时间转化为秒数
##c=n%a # 计算当前天的余点
####求小时
##hour=c//(60*60*1000)
####求分钟
##minu=(c%(60*60*1000))//(60*1000)
####求秒钟
##sec=(c%(60*1000))//1000
##print('%02d'%hour,end=':')
##print('%02d'%minu,end=':')
##print('%02d'%sec,end='')
n=int(input())
n=n//1000
result=time.strftime('%Y-%d-%m %X',time.gmtime(n))
print(result) # 2021-18-04 01:08:23
print(result[-8:])

左孩子右兄弟

5
1
1
1
2
4
def combia(candidates,target):
    candidates.sort()
    n=len(candidates)
    res=[]
    def back(i,tmp_sum,tmp):
        if tmp_sum>target or i==n: # 如果超出条件、或者到最后一个,退出到上一层
            return
        if tmp_sum==target: # 如果满足目标,将临时答案加入
            res.append(tmp)
        for j in range(i,n):# 如果未满足,继续
            if tmp_sum+candidates[j] > target:# 如果新加入节点超出预期,终止本次(剪枝)
                break
            back(j,tmp_sum+candidates[j],tmp+[candidates[j]])# 否则,继续深入,将本次的起点位置,临时结果,临时数值传递给下一届
    back(0,0,[])# 初始
    return res
print(combia(candidates = [2,3,6,7], target = 7))
   res.append(tmp)
    for j in range(i,n):# 如果未满足,继续
        if tmp_sum+candidates[j] > target:# 如果新加入节点超出预期,终止本次(剪枝)
            break
        back(j,tmp_sum+candidates[j],tmp+[candidates[j]])# 否则,继续深入,将本次的起点位置,临时结果,临时数值传递给下一届
back(0,0,[])# 初始
return res

print(combia(candidates = [2,3,6,7], target = 7))


举报

相关推荐

0 条评论