蓝桥杯真题(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 += 1
    for j in str(i):
        di[j] -= 1
        if di[j] < 0:
            flag = False
            break

print(i-1)#3181

B、直线

#两点确定一条直线,
#斜率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

C、货物摆放

#对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

D、路径

最大公因数:两数的最大因数。

最小公倍数:两数之积与最大公因数的商。

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组 

记录一下比赛仅仅会的一道题吧——十三届蓝桥杯python组B组

A题

大概就是字母排序A-Z排序,没学过都能看出他是字母排序。所以不能说算会

s = 'WHERETHEREISAWILLTHEREISAWAY'
li = list(s)
li.sort()
a = ''.join(li)
print(a)#AAAEEEEEEHHHIIILLRRRSSTTWWWY

F题

去掉字符边缘。比如说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

你可能感兴趣的:(#,蓝桥杯,蓝桥杯,python)