蓝桥杯Python组2020年真题详细解析(我太菜,所以只有前⼋题的解析)
试题A:门牌制作
(本题总分:5分)
【问题描述】
⼩蓝要为⼀条街的住户制作门牌号。
这条街⼀共有2020位住户,门牌号从1到2020编号。
⼩蓝制作门牌的⽅法是先制作0到9这⼏个数字字符,最后根据需要将字 符粘贴到门牌上,例如门牌1017需要依次粘贴字符1、0、
1、7,即需要1个 字符0, 2个字符1, 1个字符7。
请问要制作所有的1到2020号门牌,总共需要多少个字符2?
【答案提交】
这是⼀道结果填空的题,你只需要算出结果后提交即可。本题的结果为⼀ 个整数,在提交答案时只填写这个整数,填写多余的内容将⽆法得分。
解析:
⼀道签到题,不做过多分析。
1到2020中包含2的个数,有两种⽅式,⼀种是数字分离,⼀种是转化成字符串,这⾥直接写第⼆种了:
num =0#声明⼀个变量⽤来存储答案
for i in range(1,2021):#1-2020的循环
temp =str(i)#转成字符串
for j in temp:#在这个字符串内循环
if j =='2':#如果当前循环到的是字符2
num +=1#计数器加1
print(num)#输出
运⾏后,答案为624。
试题B:寻2020
(本题总分:5分)
⼩蓝有⼀个数字矩阵,⾥⾯只包含数字。和2。⼩蓝很喜欢2020,他想 到这个数字矩阵中有多少个2020。
⼩蓝只关注三种构成2020的⽅式:
·同⼀⾏⾥⾯连续四个字符从左到右构成2020。
·同⼀列⾥⾯连续四个字符从上到下构成2020。
·在⼀条从左上到右下的斜线上连续四个字符,从左上到右下构成2020。
例如,对于下⾯的矩阵:
220000
000000
002202
000000
000022
002020
⼀共有5个2020。其中1个是在同⼀⾏⾥的,1个是在同⼀列⾥的,3个 是斜线上的。
⼩蓝的矩阵⽐上⾯的矩阵要⼤,由于太⼤了,他只好将这个矩阵放在了⼀ 个⽂件⾥⾯,在试题⽬录下有⼀个⽂件,⾥⾯给出了⼩蓝的矩阵。
请帮助⼩蓝确定在他的矩阵中有多少个2020.
【答案提交】
这是⼀道结果填空的题,你只需要算出结果后提交即可。本题的结果为⼀ 个整数,在提交答案时只填写这个整数,填写多余的内容将⽆法得分。
解析:
填空题,暴⼒就完了。
我做题的思路⼀般是先考虑输⼊、再考虑输出,最后考虑中间的运算,那么⾸先要写的就是⽂件读取,将⽂件读取到列表中。
⽽后就是⼀个双层while循环就可以了:
f =open("1.txt","r")#⽂件打开
ls = f.read().split('\n')#⽤换⾏分割这个巨⼤的字符串
max_i =len(ls)#⾏数
max_j =len(ls[0])#列数
i =0
四舍五入函数保留整数
count =0#计数器
while i < max_i-3:#外层循环
j =0
while j < max_j-3:#内层循环
if ls[i][j]=='2'and ls[i][j+1]=='0'and ls[i][j+2]=='2'and ls[i][j+3]=='0':
count +=1
if ls[i][j]=='2'and ls[i+1][j]=='0'and ls[i+2][j]=='2'and ls[i+3][j]=='0':
count +=1
if ls[i][j]=='2'and ls[i+1][j+1]=='0'and ls[i+2][j+2]=='2'and ls[i+3][j+3]=='0':
count +=1
j +=1
i +=1
print(count)
试题C:跑步锻炼
(本题总分:10分)
⼩蓝每天都锻炼⾝体。
正常情况下,⼩蓝每天跑1千⽶。如果某天是周⼀或者⽉初(1⽇),为了 激励⾃⼰,⼩蓝要跑2千⽶。如果同时是周⼀或⽉初,⼩蓝也是跑2千⽶。
⼩蓝跑步已经坚持了很长时间,从2000年1⽉1⽇周六(含)到2020年 10⽉1⽇周四(含)。 请问这段时间⼩蓝总共跑步多少千⽶?
【答案提交】
这是⼀道结果填空的题,你只需要算出结果后提交即可。本题的结果为⼀ 个整数,在提交答案时只填写这个整数,填写多余的内容将⽆法得分。
【解析】
第⼀反应,2000到2020⼏个闰年⼏个平年,然后开两个12位的列表,数字填进去,分别求平年闰年的跑步距离。
第⼆反应,卧槽,没必要⾃⼰求啊,Python那强⼤的库[],不⽤不是⽩瞎了吗…
import datetime#⽇期库
now = datetime.date(2000,1,1)#初始化⽇期
endl = datetime.date(2020,10,1)#结束⽇期
count =0#计数器
while now <= endl:
if now.day ==1or now.isoweekday()==1:
count +=2
else:
count +=1
now += datetime.timedelta(days=1)#⽇期加⼀
print(count)
试题D:蛇形填数
(本题总分:10分)
如下图所⽰,⼩明⽤从1开始的正整数“蛇形”填充⽆限⼤的矩阵。
1 2 6 7 15 …
3 5 8 1
4 …
4 9 13 …
10 12 …
11 …
容易看出矩阵第⼆⾏第⼆列中的数是5。请你计算矩阵中第20⾏第20列 的数是多少?
【答案提交】
这是⼀道结果填空的题,你只需要算出结果后提交即可。本题的结果为⼀ 个整数,在提交答案时只填写这个整数,填写多余的内容将⽆法得分。
【解析】
⾸先,这道题其实不需要编码计算。
我们可以规律:
5 = (4+6)/2
13 = (11+15/2)
1. 每⼀斜⾏的中间值是这⼀⾏⾸位之和的⼀半
2. 每⼀斜⾏的⾸项是1+2+3+…+n+1
3.(20,20)有38斜⾏
然后就可以算了:
(1+38)*38/2 + 19 + 1 = 761
【代码⽅式】
如果⾮要写个代码的话,我们就弄个列表
每次往列表⾥添加不同的元素
ls =[[]]#初始化列表
step =1#
step_now =0#每当step_now达到step时,本斜⾏写完
mark =0#当前填数位置
statu_count =1# 1对应向上,-1对应向下
for i in range(1,1000):
if step == step_now:#此时⼀⾏写完
ls.append([])#添加新列表,在最下⽅
statu_count =int(((step%2)-0.5)*2)*-1#根据当前step判断该往哪个⽅向填数
step +=1#下⼀斜⾏多了⼀个数字
step_now =0#归零
if(step %2==1):#将当前填数位置更新
mark =0
else:
mark = step-1
ls[mark].append(i)#填数
mark += statu_count#更新填数
step_now +=1
print(ls[19][19])#输出列表的(20,20),毕竟第⼀个数字是(0,0)
试题E:排序
(本题总分:15分)
【问题描述】
⼩蓝最近学习了⼀些排序算法,其中冒泡排序让他印象深刻。
在冒泡排序中,每次只能交换相邻的两个元素。
⼩蓝发现,如果对⼀个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序⽅案中,冒泡排序的总交换次数是最少的。
例如,对于字符串lan排序,只需要1次交换。对于字符串qiao排序, 总共需要4次交换。
⼩蓝到了很多字符串试图排序,他恰巧碰到⼀个字符串,需要100次交 换,可是他忘了吧这个字符串记下来,现在不到了。
请帮助⼩蓝⼀个只包含⼩写英⽂字母且没有字母重复出现的字符串,对该串的字符排序,正好需要1
00次交换。如果可能到多个,请告诉⼩蓝最短 的那个。如果最短的仍然有多个,请告诉⼩蓝字典序最⼩的那个。
【答案提交】
这是⼀道结果填空的题,你只需要算出结果后提交即可。本题的结果为⼀个只包含⼩写英⽂字母的字符串,在提交答案时只填写这个字符串,填写多余 的内容将⽆法得分。
【解析】
⾸先,我们需要最短的字符串。冒泡排序中的每⼀次交换就是⼀个消除逆序数对的过程,我们需要在最短的路径中安排最多的逆序数对。
所以,我们先计算⼀下,第⼀个字符的最⼤逆序数是(n-1),最后⼀个字符的最⼤逆序数是1。
那么,n个字符的字符串的最⼤逆序数为(1+n-1)(n-1)/2。
所以,以此可以反推出n = 15。
然后,再把第k个字符拿到第⼀个上⾯,减少k-1个逆序数
(1514/2) - (k-1) = 100,即可。
下⾯我们来写⼀个,输⼊n,输出此字符串的代码:
import math
def str_best(MAXM):#⽤来⽣成最⼤逆序数字符串
i =0
c =''
MAXM -=1
while i >=-1* MAXM:
m =ord('a')+ MAXM + i
c +=chr(m)
i -=1
return c
def str_change(str,num):#⽤来求解最终答案
m =str[num]
return m +str[:num]+str[num+1:]
def str_length(x):#⽤来求解最⼤逆序数字符串长度
x *=2
i =1
while1:
if  x <= i*(i+1):
return i+1
i +=1
n =int(input())
length = str_length(n)
thisstr = str_best(length)
ans = str_change(thisstr,int(length *(length -1)/2)- n)
print(ans)
#print(nx(ans))
下⾯我们再顺⼿写⼀个求逆序数的⼩函数,⽤于检查我们的答案:
def nx(x):
n =len(x)
ls =list(x)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。