第十四届蓝桥杯国赛 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.