第十四届蓝桥杯国赛 Python 大学A组个人题解及答案

刚刚摘bing上搜了一圈,并没有发现好的题解,就自己写写。

大佬代码,可以看看

前两道题没啥好说的:

month = [0,31,28,31,30,31,30,31,31,30,31,30,31]

#2023-1-1 --星期天

week = 6 # when week is 0 --> cnt+=5

cnt = 0

for  i in range(1,13):
    for j in range(1,month[i]+1):
        if i%10 == 1 or i//10 == 1 or j%10 == 1 or j//10 == 1 or week == 0:
            cnt+=5
        else:
            cnt+=1
        week += 1
        week %= 7

print(cnt)
#1333

sta=['1111110','0110000','1101101','1111001','0110011','1011011','1011111','1110000','1111111','1111011']

a=['0000011','1001011','0000001','0100001','0101011','0110110','1111111','0010110','0101001',
   '0010110','1011100','0100110','1010000','0010011','0001111','0101101','0110101','1101010']
b=['1011111','1110011']


def check(a):
    global sta
    cnt = 0
    for s in sta:
        f = True
        for i in range(len(s)):
            if a[i] == '1' and s[i] == '0':
                f = False
                break
        if f :cnt+=1
    return cnt

ans = 1
for i in a:
    ans *= check(i)

print(ans)
#254016000

刚开始就简单想了一个模拟:

结果用递归因为有最大递归次数限制,只能过30%,

改为while,因为超时,也只过了60%。。。。。。。。。。

# 60%
n = int(input())

cnt = 0

while n:
    if n <= 0:break
    cnt += 1
    a = n
    while a:
        n -= a%10
        a //= 10

print(cnt)

大佬也只过60%,可以走了。。。。。

其实换成pypy3就可以了,世界真奇妙。

太菜了。。。。只能暴力过15%。。。。

a , b = map(int,input().split())

a = a - b * 4

n = a + b    ;    mod = 998244353

def f(n):
    if n <= 1:return 1
    global mod
    return n*f(n - 1)%mod

#c(n,b)*10**a =  n!//a!//(n-a)!

def ref(a):
    if a<= 1:return 1
    global mod
    return qmi(a,mod-2,mod)*ref(a-1)%mod


def qmi(a,b,mod):
    # a^b
    ans = 1
    while b:
        if b&1 == 1:ans *= a
        a*=a
        b>>=1
        ans%=mod
        a%=mod
    return ans

def c(n,a):
    return f(n)*ref(a)%mod*ref(n-a)%mod

print(c(n,min(a,b))*qmi(10,a,mod)%mod)



由于以下公式:(效果更不好),不过可以看看

解析见注释:过  –85%

设置一个dp数组就行了,想好转移方程,以及初始状态。

#全局考量--要用dp
#01背包升级版!
n , a , b = map(int,input().split())
weight = [0] + list(map(int,input().split()))

dp = [[[0 for i in range(b+1)] for j in range(a+1)] for k in range(n+1)]

#f[i][j][k] --前i个 , 一车厢 a 体积 ,二车厢 b 体积

for ii in range(a+1):
    for jj in range(b+1):
        if max(ii,jj) >= weight[1]:
            dp[1][ii][jj] = weight[1]

for i in range(2,n + 1):
    for j in range(1,a + 1):
        for k in range(1,b + 1):
            w = weight[i]
            if j >= weight[i] and k >= w :
                dp[i][j][k] =  max(dp[i-1][j][k],max(dp[i-1][j-w][k],dp[i-1][j][k-w])+w)
            elif j >= weight[i] and k < w :
                dp[i][j][k] =  max(dp[i-1][j][k],dp[i-1][j-w][k]+w)
            elif j < weight[i] and k >= w :
                dp[i][j][k] =  max(dp[i-1][j][k],dp[i-1][j][k-w]+w)
            else:
                dp[i][j][k] =  dp[i-1][j][k]

print(dp[n][a][b])

emmmmm。。。。。看见是因为超内存了,于是想到dp数组的第一维可以去掉

需要小心的是:去掉过后,对于dp[j][k] 是要从后向前更新的,

因为: dp[j][k] 是用它前面上一层的来更新的,如果已经更新成这一层,就不对了

就可以过–95%了!(开心,but why 我还是有一个样例没有过????? )

#全局考量--要用dp
#01背包升级版!
n , a , b = map(int,input().split())
weight = [0] + list(map(int,input().split()))

dp = [[0 for i in range(b+1)] for j in range(a+1)]

#f[i][j][k] --前i个 , 一车厢 a 体积 ,二车厢 b 体积

for ii in range(a+1):
    for jj in range(b+1):
        if max(ii,jj) >= weight[1]:
            dp[ii][jj] = weight[1]

for i in range(2,n + 1):
    for j in range(a ,0,-1):
        for k in range(b ,0,-1):
            w = weight[i]
            if j >= weight[i] and k >= w :
                dp[j][k] =  max(dp[j][k],max(dp[j-w][k],dp[j][k-w])+w)
            elif j >= weight[i] and k < w :
                dp[j][k] =  max(dp[j][k],dp[j-w][k]+w)
            elif j < weight[i] and k >= w :
                dp[j][k] =  max(dp[j][k],dp[j][k-w]+w)


print(dp[a][b])

思路:

刚开始的时候要小心读题, (4)依然是对行的操作,不是对列的操作。

1.bfs()

我刚开始就想到用bfs(),因为递归的次数可能会超,所以得分不会太高。

bfs()的时候,注意我们的目标的 (1,1) -> (N,N) ,所以第四条规则不用管,我们先对于 (x,y)

(1)  x+1

(2)    y向右走,能走多远走多远,尽量向 (N,N)上靠

–过20%

#起点-终点-bfs()

'''
4
0 1 9 3
2 9 3 7
8 4 8 9
9 8 0 7

'''
N = int(input())

ans = float('inf')

dist = [0] + [[0] + list(map(int,input().split())) for i in range(N)]

#print(dist)

def bfs(x , y , d):
    #print(x,y,d)
    global N,ans
    if x == N and y == N : ans = min(ans , d)
    #→
    if x < N:
        bfs(x + 1, y , d + 1)
    if y < N:
        dy = y + 1 ; ty = y
        if dist[x][dy] < dist[x][ty]:
            while dy < N and dist[x][dy + 1] < dist[x][ty + 1]:
                dy += 1 ; ty += 1
        bfs(x , dy , d + 1)

bfs(1,1,0)

print(ans)
    
    

…….未完待续

作者:RedCap.

物联沃分享整理
物联沃-IOTWORD物联网 » 第十四届蓝桥杯国赛 Python 大学A组个人题解及答案

发表回复