蓝桥杯真题(python)+B组真题+解题链接
藍橋杯原題級別。以十二屆藍橋杯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題
代碼注釋:?
純代碼:?
十二屆python組A組
2021年第十二屆藍橋杯軟件類省賽python組
A、卡片
#2021張,用字典對應數字和卡片數#創建卡片字典,每個卡片2021張。 di = {} n = 2021 for i in range(10):di[str(i)] = n # print(di)#開始對每一個數取出卡片,直到沒有卡片拼數字 flag = True i = 0 while flag:i += 1for j in str(i):di[j] -= 1if di[j] < 0:flag = Falsebreakprint(i-1)#3181B、直線
#兩點確定一條直線, #斜率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:#特殊處理continuek = (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)#40257C、貨物擺放
#對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:#判斷乘積為nans += 1print(ans)#2340D、路徑
最大公因數:兩數的最大因數。
最小公倍數:兩數之積與最大公因數的商。
DP:大概就是尋找n與n-i的關系。對于此題:dp[j] = min(dp[j],dp[i]+lcm(i,j))
模板:
#模板1,math.gcd(a,b)求解最大公因數 import mathdef lcm(a,b):return a*b//math.gcd(a,b) #模板2,最小公倍數模板(least common multiple) def lcm(a,b):s=a*bwhile b:a,b=b,a%breturn s//a #兩點之間最短路徑 #最小公倍數 import mathdef lcm(a,b):return a*b//math.gcd(a,b)dp = [float('inf')]*(2021+1)#無窮大dp[1] = 0for i in range(1,2021+1):for j in range(i+1,i+21+1):if j > 2021:breakdp[j] = min(dp[j],dp[i]+lcm(i,j))#取最小print(dp[2021]十三屆python組B組?
記錄一下比賽僅僅會的一道題吧——十三屆藍橋杯python組B組
A題
大概就是字母排序A-Z排序,沒學過都能看出他是字母排序。所以不能說算會
s = 'WHERETHEREISAWILLTHEREISAWAY' li = list(s) li.sort() a = ''.join(li) print(a)#AAAEEEEEEHHHIIILLRRRSSTTWWWYF題
去掉字符邊緣。比如說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]:#第一種情況:addindex_set.add(i)index_set.add(i-1)if li[i] == li[i-1] and li[i] != li[i+1]:#第二種情況:ddcindex_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 = Falsebreak現在的感覺是我跳過了范圍 ,難道應該這樣寫?
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=Falsebreak試了一下,筆記本嗡嗡嗡~~~,是CPU在燃燒,又學會了一種干廢電腦的方法。哈哈
G題看了一眼不會。記不清了。
似乎這B組比A組難吧。。。可以上網,但根本沒時間去搜,不會就是不會。
堅毅——GRIT
總結
以上是生活随笔為你收集整理的蓝桥杯真题(python)+B组真题+解题链接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试时如何优雅地自我介绍?
- 下一篇: python中restful接口开发实例