蓝桥杯原题级别。以十二届蓝桥杯python试题备战明天十三届蓝桥杯。
实践证明:
python基础知识很重要。
蓝桥杯真题大于蓝桥杯算法。(短时间内)
二维列表按第二个元素逆序排序:list.sort(key = lambda x:x[1],reverse = True)
补充:
2022年十三届蓝桥杯python组B组原题:2022第十三届蓝桥杯省赛B组Python
2022年十三届蓝桥杯python组B组解题:2022第十三届蓝桥杯PythonB组-pudn.com
目录
十二届python组A组
A、卡片
B、直线
C、货物摆放
D、路径
十三届python组B组
A题
F题
代码注释:
纯代码:
2021年第十二届蓝桥杯软件类省赛python组
#2021张,用字典对应数字和卡片数
#创建卡片字典,每个卡片2021张。
di = {}
n = 2021
for i in range(10):
di[str(i)] = n
# print(di)
#开始对每一个数取出卡片,直到没有卡片拼数字
flag = True
i = 0
while flag:
i += 1
for j in str(i):
di[j] -= 1
if di[j] < 0:
flag = False
break
print(i-1)#3181
#两点确定一条直线,
#斜率k和截距b不同,那么就是不同的直线
#特殊的,斜率不存在,即x1 = x2
#建立所有坐标点
xoy = [[x,y] for x in range(20) for y in range(21)]
#print(xoy)
#建立已经包含的直线
line = set()
for i in range(len(xoy)):#确定第一个点
x1,y1 = xoy[i][0],xoy[i][1]
for j in range(i+1,len(xoy)):#确定第二个点
x2,y2 = xoy[j][0],xoy[j][1]
if x1 == x2:#特殊处理
continue
k = (y2-y1)/(x2-x1)
b = (x2*y1-x1*y2)/(x2-x1)
#if (k,b) not in line:#如果是集合,必然不会重复,可以少一个if判断
line.add((k,b))#不同的(k,b)放入直线的集合
print(len(line)+20)#40257
#对n求解质因数,组合因数乘积为n
n=2021041820210418
ans = 0
docker = set()
for i in range(1,int(n**0.5)+1):#n的开方,减少循环
if n%i == 0:#判断并把因数放入集合
docker.add(i)
docker.add(n//i)
for a in docker:
for b in docker:
for c in docker:
if a*b*c == n:#判断乘积为n
ans += 1
print(ans)#2340
最大公因数:两数的最大因数。
最小公倍数:两数之积与最大公因数的商。
DP:大概就是寻找n与n-i的关系。对于此题:dp[j] = min(dp[j],dp[i]+lcm(i,j))
模板:
#模板1,math.gcd(a,b)求解最大公因数 import math def lcm(a,b): return a*b//math.gcd(a,b)
#模板2,最小公倍数模板(least common multiple) def lcm(a,b): s=a*b while b: a,b=b,a%b return s//a
#两点之间最短路径
#最小公倍数
import math
def lcm(a,b):
return a*b//math.gcd(a,b)
dp = [float('inf')]*(2021+1)#无穷大
dp[1] = 0
for i in range(1,2021+1):
for j in range(i+1,i+21+1):
if j > 2021:
break
dp[j] = min(dp[j],dp[i]+lcm(i,j))#取最小
print(dp[2021]
记录一下比赛仅仅会的一道题吧——十三届蓝桥杯python组B组
大概就是字母排序A-Z排序,没学过都能看出他是字母排序。所以不能说算会
s = 'WHERETHEREISAWILLTHEREISAWAY'
li = list(s)
li.sort()
a = ''.join(li)
print(a)#AAAEEEEEEHHHIIILLRRRSSTTWWWY
去掉字符边缘。比如说eddf,dd是连续的,那么和dd相连的ed和df就是边缘,去掉就好。
很简单吧,没错四个小时就写了这一个题。运用了我几乎全部的python基础知识,并且和前两天学的算法无一毛钱关系。
代码注释:
纯代码:
#接受输入
li = list(input())
##便于后边调用64次
def fun(li):
index_set = set()#用集合保存下标,不会重复
for i in range(1,len(li)-1):#从第二个开始到倒数第二个(因为下边有i-1和i+1,不然会超范围)
if li[i] == li[i+1] and li[i] != li[i-1]:#第一种情况:add
index_set.add(i)
index_set.add(i-1)
if li[i] == li[i-1] and li[i] != li[i+1]:#第二种情况:ddc
index_set.add(i)
index_set.add(i+1)
index_list = list(index_set)#集合变列表,无序变有序
index_list.sort(reverse=True)#列表倒序
for j in index_list:#按倒序下标删除对应列表元素,不会出现混乱
li.pop(j)
#题目要求对输入进行64次去边缘
for i in range(64):
fun(li)
#按要求输出
if len(li) == 0:
print('EMPTY')
else:
s = ''.join(li)
print(s)
li = list(input())
def fun(li):
index_set = set()
for i in range(1,len(li)-1):
if li[i] == li[i+1] and li[i] != li[i-1]:
index_set.add(i)
index_set.add(i-1)
if li[i] == li[i-1] and li[i] != li[i+1]:
index_set.add(i)
index_set.add(i+1)
index_list = list(index_set)
index_list.sort(reverse=True)
for j in index_list:
li.pop(j)
for i in range(64):
fun(li)
if len(li) == 0:
print('EMPTY')
else:
s = ''.join(li)
print(s)
B题把我搞吐了,意思是找出一个10的17次方以内的最小数。这个最小数对2到49这些数求余的值在表格中告诉了。弄了2个小时直到结束,晕了。
我的思路:
表格中取余后求多的数是11,比如:n%a==11,n%b==11,n%c==11。
那么这个数应该是n(n = a*b*c*i + 11,i取0,1,2,3...)
肯定是这些数中的一个吧,他要取最小,那我就从0开始递增取,
直到符合所有取余条件,我就输出值,并结束循环。
应该是能输出的吧。。。
可是i取值从0到10**9都没有值,n的范围早已到10**19
flag = True while flag: for i in range(10): n = 12*14*22*23*33*43*44*i + 11 #print(n)#n肯定是求余后为11吧 if n%49==48 and n%49==41 and n%47==21 and n%46==5: if n%2==1 and n%3==2 and n%4==1:#这样判断余数为对应值,符合的话应该能输出吧 #... print(n) flag = False break
现在的感觉是我跳过了范围 ,难道应该这样写?
flag = True while flag: for i in range(10**9,10**17): if i%49==46: if i%48==41: if i%47==5: if i%46==15: print(i,'test01') if i%45==29: if i%44==33: print(i,'test02') if i%43==11: if i%42==11: print(i) flag=False break
试了一下,笔记本嗡嗡嗡~~~,是CPU在燃烧,又学会了一种干废电脑的方法。哈哈
G题看了一眼不会。记不清了。
似乎这B组比A组难吧。。。可以上网,但根本没时间去搜,不会就是不会。
坚毅——GRIT