近日参加了蓝桥杯校内选拔赛,在复盘中进行总结与提升,并且帮助到有需要的人。同时希望和各位伙伴相互监督,共同进步!!!

1. 二进制位数

问题描述

十进制整数 2 在十进制中是 1 位数,在二进制中对应 10 ,是 2 位数。
十进制整数 22 在十进制中是 2 位数,在二进制中对应 10110 ,是 5 位数。
请问十进制整数 2022 在二进制中是几位数?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

参考答案+源码

11
#方法一:整除,累加 i=2022 count=0 while i: count+=1 i//=2 print(count)
#方法二:直接使用求二进制函数,去掉2位0b print(len(bin(2022))-2)

2. 晨跑

问题描述

小蓝每周六、周日都晨跑,每月的 1、11、21、31日也晨跑。其它时间不晨跑。
已知 2022年1月1日是周六,请问小蓝整个2022年晨跑多少天?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

参考答案+源码

138
#法一:可以日历口算(最粗暴) #法二:对全年依次遍历,当满足条件周六、日,以及一个月的1、11、21、31时,累加
month=[31,28,31,30,31,30,31,31,30,31,30,31] day=1 weekend=6 count=0 for i in
range(len(month)): day=1 for j in range(month[i]): if weekend==6 or weekend==0
or day in (1,11,21,31): count+=1 weekend=(weekend+1)%7 day+=1 print(count)

3. 调和级数

问题描述

小蓝特别喜欢调和级数 S(n)=1/1+1/2+1/3+1/4+…+1/n 。
请问,n 至少为多大时,S(n)>12 ?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

参考答案+源码

91380
#就是简单的遍历,循环 i=1 sum=0 while sum<=12: sum+=1/i i+=1 print(i-1)

4. 山谷

问题描述

给定一个字母矩阵,如果矩阵中的某个位置不在四条边上,而且该位置上的字母小于其上下左右四个位置的字母,则称为一个山谷。
例如,对于如下矩阵

DDDDD
CADCE
FFFFA

共有两个山谷,位于第二行第二列和第四列。请注意第二行第三列和第三行第五列都不是山谷。
对于如下30行60列的字母矩阵(请用等宽字体查看),请问有多少个山谷?

PHQGHUMEAYLNLFDXFIRCVSCXGGBWKFNQDUXWFNFOZVSRTKJPREPGGXRPNRVY
STMWCYSYYCQPEVIKEFFMZNIMKKASVWSRENZKYCXFXTLSGYPSFADPOOEFXZBC
OEJUVPVABOYGPOEYLFPBNPLJVRVIPYAMYEHWQNQRQPMXUJJLOOVAOWUXWHMS
NCBXCOKSFZKVATXDKNLYJYHFIXJSWNKKUFNUXXZRZBMNMGQOOKETLYHNKOAU
GZQRCDDIUTEIOJWAYYZPVSCMPSAJLFVGUBFAAOVLZYLNTRKDCPWSRTESJWHD
IZCOBZCNFWLQIJTVDWVXHRCBLDVGYLWGBUSBMBORXTLHCSMPXOHGMGNKEUFD
XOTOGBGXPEYANFETCUKEPZSHKLJUGGGEKJDQZJENPEVQGXIEPJSRDZJAZUJL
LCHHBFQMKIMWZOBIWYBXDUUNFSKSRSRTEKMQDCYZJEEUHMSRQCOZIJIPFION
EEDDPSZRNAVYMMTATBDZQSOEMUVNPPPSUACBAZUXMHECTHLEGRPUNKDMBPPW
EQTGJOPARMOWZDQYOXYTJBBHAWDYDCPRJBXPHOOHPKWQYUHRQZHNBNFUVQNQ
QLRZJPXIOGVLIEXDZUZOSRKRUSVOJBRZMWZPOWKJILEFRAAMDIGPNPUUHGXP
QNJWJMWAXXMNSNHHLQQRZUDLTFZOTCJTNZXUGLSDSMZCNOCKVFAJFRMXOTHO
WKBJZWUCWLJFRIMPMYHCHZRIWKBARXBGFCBCEYHJUGIXWTBVTREHBBCPXIFB
XVFBCGKCFQCKCOTZGKUBMJRMBSZTSSHFROEFWSJRXJHGUZYUPZWWEIQURPIX
IQFLDUUVEOOWQCUDHNEFNJHAIMUCZFSKUIDUBURISWTBRECUYKABFCVKDZEZ
TOIDUKUHJZEFCZZZBFKQDPQZIKFOBUCDHTHXDJGKJELRLPAXAMCEROSWITDP
TPCCLIFKELJYTIHRCQAYBNEFXNXVGZEDYYHNGYCDRUDMPHMECKOTRWOSPOFG
HFOZQVLQFXWWKMFXDYYGMDCASZSGOVSODKJGHCWMBMXRMHUYFYQGAJQKCKLZ
NAYXQKQOYZWMYUBZAZCPKHKTKYDZIVCUYPURFMBISGEKYRGZVXDHPOAMVAFY
RARXSVKHTQDIHERSIGBHZJZUJXMMYSPNARAEWKEGJCCVHHRJVBJTSQDJOOTG
PKNFPFYCGFIEOWQRWWWPZSQMETOGEPSPXNVJIUPALYYNMKMNUVKLHSECDWRA
CGFMZKGIPDFODKJMJQWIQPUOQHIMVFVUZWYVIJGFULLKJDUHSJAFBTLKMFQR
MYJFJNHHSSQCTYDTEAMDCJBPRHTNEGYIWXGCJWLGRSMEAEARWTVJSJBAOIOJ
LWHYPNVRUIHOSWKIFYGTYDHACWYHSGEWZMTGONZLTJHGAUHNIHREQGJFWKJS
MTPJHAEFQZAAULDRCHJCCDYRFVVRIVUYEEGFIVDRCYGURQDREDAKUBNFGUPR
OQYLOBCWQXKZMAUSJGMHCMHGDNMPHNQKAMHURKTRFFACLVGRZKKLDACLLTEO
JOMONXRQYJZGINRNNZWACXXAEDRWUDXZRFUSEWJTBOXVYNFHKSTCENAUMNDD
XFDMVZCAUTDCCKXAAYDZSXTTOBBGQNGVVPJGOJOGLMKXGBFCPYPCKQCHBDDZ
WRXBZMQRLXVOBTWHXGINFGFRCCLMZNMJUGWWBSQFCIHUBSJOLLMSQSGHMCPH
ELSOTFLBGSFNPCUZSRUPCHYNVZHCPQUGRIWNIQXDFJPWPXFBLKPNPEELFJMT

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

参考答案+源码

276
#除去边界情况,直接暴力每一个顶点的上下左右进行比较大小 mountain=[] for i in range(30):
mountain.append(list(input())) count=0 for i in range(1,30): for j in
range(1,60): if i==29 or j==59: continue else: if
mountain[i][j]<mountain[i-1][j] and mountain[i][j]<mountain[i+1][j] and
mountain[i][j]<mountain[i][j-1] and mountain[i][j]<mountain[i][j+1]: count+=1
print(count)

5. 最小矩阵

问题描述

小蓝有一个 100 行 100 列的矩阵,矩阵的左上角为 1。其它每个位置正好比其左边的数大 2,比其上边的数大 1 。
例如,第 1 行第 2 列为 3,第 2 行第 2 列 为 4,第 10 行第 20 列为 48。
小蓝想在矩阵中找到一个由连续的若干行、连续的若干列组成的子矩阵,使得其和为 2022,请问这个子矩阵中至少包含多少个元素(即子矩阵的行数和列数的乘积)。

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

参考答案+源码

12
#循环暴力,由两个顶点---左上顶点和右下顶点来决定矩阵大小,根据两个顶点求矩阵元素个数 def minmaxterix():
martrix=[[0]*100 for i in range(100)] for i in range(100): martrix[0][i]=2*i+1
martrix[i][0]=i+1 # print(martrix) # martrix[0][0]=1 for i in range(1,100): for
j in range(1,100): martrix[i][j]=martrix[i][j-1]+2 # print(martrix) def
sum(i,j,k,l): s=0 for i1 in range(i,k+i): for i2 in range(j,j+l):
s+=martrix[i1][i2] return s ans=100000000 for i in range(100): for j in
range(100): for k in range(1,100-i+1): for l in range(1,100-j+1): if
sum(i,j,k,l)==2022: ans=min(ans,k*l) print(ans) break elif sum(i,j,k,l)>2022:
break print(ans) minmaxterix()

6. 核酸日期

问题描述

如果周一做核酸,周二显示核酸天数为 1 天,周三显示 2 天,以此类推,周六显示 5 天,周日显示 6 天。
小蓝在某一天做了一次核酸,请问他的核酸显示为几天。已知做核酸和查看核酸不是在同一天,而且相差不超过 6 天(显示的数为 1 到 6 之间的数)。

输入格式
输入第一行包含一个整数 s ,表示小蓝做核酸是周几。 s 为 1 到 6 依次表示周一到周六,s 为 7 表示周日。
第二行包含一个整数 t ,表示查看核酸是周几。 t 为 1 到 6 依次表示周一到周六,t 为 7 表示周日。

输出格式
输出一行包含一个整数,表示答案。

样例输入
5
2

样例输出
4

评测用例规模与约定
对于所有评测用例,1 < = s , t < = 7 1 <= s, t <= 71<=s,t<=7。

源码
# 做核酸 s=int(input()) # 查核酸 t=int(input()) # 表示查时间与做核酸时间已经隔了一周了 if s>t:
print(t+7-s) else: print(t-s)

7. 英文转换

问题描述

输入一个由小写英文字母组成的字符串,请将其中的元音字母(a, e, i, o, u)转换成大写,其它字母仍然保持小写。

输入格式
输入一行包含一个字符串。

输出格式
输出转换后的字符串。

样例输入
lanqiao

样例输出
lAnqIAO

评测用例规模与约定
对于所有评测用例,字符串的长度不超过100。

源码
#转大小写问题,给出两个方法 str1=list(input()) for i in range(len(str1)): if str1[i] in
('a','e','i','o','u'): str1[i]=chr(ord(str1[i])-32) #此处为方法二: #
str1[i]=str1[i].upper() print(''.join(str1))

8. 充电器

问题描述

小蓝有一个充电器,可以使用不同的电压和电流充电。
给定充电器工作的记录,请计算在这个记录期间总共通过充电传输了多少电能。

输入格式
输入第一行包含一个整数 n , 表示记录的条数。
接下来 n 行,每行包含一个时刻 T 和两个非负整数 U, I,表示在时刻 T 充电电压变为 U(单位伏),电流变为 I(单位A)。最后一行满足 U 和
I 均为 0,在前面的行中也可能出现 U、I 为 0 的情况。其中时间表示为 HH:MM:SS 的格式,时分秒分别用两位十进制数表示(补前导零)。
输入保证时刻依次递增且在 00:00:00 至 23:59:59 的区间内,不用考虑跨过零点充电的情况。

输出格式
输出一个整数,表示总共通电的电能为多少焦耳,其中 1 焦耳等于 1 伏乘以1 安乘以 1 秒。

样例输入
3
12:00:00 12 1
12:01:02 5 2
12:01:10 0 0

样例输出
824

评测用例规模与约定
对于所有评测用例,1 < = n < = 100 , 0 < = U , I < = 100 1 <= n <= 100, 0 <= U, I <=
1001<=n<=100,0<=U,I<=100。

源码
#方法一: n=int(input()) record=[] for j in range(n): tui=[] t,u,i=input().split()
# 使用split(),分割时间字符串并转为整数 t=list(map(int,t.split(":"))) # 因为不考虑跨国零点,可以直接当前时间的秒数
t=t[0]*60*60+t[1]*60+t[2] u=int(u) i=int(i) tui=[t,u,i] record.append(tui) if
n==1: print(0) else: sum=0 for i in range(1,len(record)):
sum+=(record[i][0]-record[i-1][0])*record[i-1][1]*record[i-1][2] print(sum)
#方法二:导入datetime库,使用库中的strption和seconds方法计算两个时间点的时间差 import datetime
n=int(input()) record=[] for j in range(n): tui=[] t,u,i=input().split()
t=datetime.datetime.strptime(t,"%H:%M:%S") u=int(u) i=int(i) tui=[t,u,i]
record.append(tui) if n==1: print(0) else: sum=0 for i in range(1,len(record)):
sum+=(record[i][0]-record[i-1][0]).seconds*record[i-1][1]*record[i-1][2]
print(sum)

9. 全相等三角形

问题描述


给定一个字母矩阵,定义一个LQ三角形为某行中连续的几个字母、某列中连续的几个字母和一条45度的斜线中连续的几个字母组成的等腰直角三角形的边缘部分,其中每条边上的字母数量相等且至少为2

  例如,对于下面的字母矩阵中,所有的字母 L 组成一个LQ三角形,所有字母 Q 组成了一个 LQ 三角形,所有字母 C 也组成了一个 LQ 三角形。

AAAAAAA  
ALLLLLA   
ALQQLAA   
ALQLAAC   
ALLAACC   
ALAACCC

如果一个 LQ 三角形边上的所有字母相等,则称为一个全相等三角形。以三个例子都是全相等三角形。
给定一个字母矩阵,请求其中有多少个全相等三角形。

输入格式
输入第一行包含两个整数 n, m,分别表示字母矩阵的行数和列数。
接下来 n 行,每行 m 个大写字母,为给定的矩阵。

输出格式
输出一行,包含一个整数,表示答案。

样例输入1
3 4
AAAA
ALAQ
ALQQ

样例输出1
4

样例输入2
6 7
AAAAAAA
ALLLLLA
ALQQLAA
ALQLAAC
ALLAACC
ALAACCC

样例输出2
23

评测用例规模与约定
对于50 % 50\%50%的评测用例,1 < = n , m < = 10 1 <= n, m <= 101<=n,m<=10。
对于所有评测用例,1 < = n , m < = 100 1 <= n, m <= 1001<=n,m<=100。

源码以及解析:
# 建造输入的矩阵 n,m=list(map(int,input().split())) mx=[] for i in range(n):
mx.append(list(input())) # 这里的数值表示当前顶点与边界的距离 # 0表示当前行或列在边界处
up,down,left,right=0,0,0,0 # 计数矩阵拥有的全相等三角形的个数 count=0 # 遍历每一个顶点 for i in
range(n): for j in range(m): up=i # 减一为了防止溢出 down=n-i-1 left=j # 减一是为了防止溢出
right=m-j-1 # 需要分成四种情况---右下直角,左下直角,左上直角,右上直角 #
min的目的是为了筛选掉不满足条件的多余顶点,(为了满足题意的全相等三角形) # 右下直角 right,down k = 0 #
依次遍历每一个全相等三角形的情况,从边长为1开始至右边或下边的最小值(为什么不是从0开始,原因在于k=0时,即自身顶点本身,不需要管他) while k <
min(right, down): bool = True # 判断当前顶点,下边和右边是否和当前顶点相等 if mx[i][j + k + 1] ==
mx[i + k + 1][j] and mx[i][j]==mx[i][j + k + 1]: # 逐一判断斜边值是否和顶点值相等
(此处可以和当前顶点和当前下边或者当前右边点的值进行比较(在上一个if中已经判定过了)) #
为什么z在(1,k+1)范围内呢?----作图可以得知,当前直角边长为k+1,因为有顶点本身,所以只在(1,k+1)范围内(不包含k+1) for z in
range(1, k + 1): if mx[i + z][j + k + 1 - z] != mx[i + k + 1][j]: bool = False
break if bool == True: count += 1 k += 1 else: break # 左下直角 left,down k=0 while
k< min(left,down): bool=True if mx[i][j-k-1]==mx[i+k+1][j] and
mx[i][j]==mx[i][j-k-1]: # 斜角边的值是否一致!!!!!!!! for z in range(1,k+1): if
mx[i+z][j-k-1+z]!=mx[i+k+1][j]: bool=False break if bool==False: break count+=1
k+=1 else: break # 左上直角 left,up k = 0 while k < min(left, up): bool=True if
mx[i][j - k - 1] == mx[i - k - 1][j] and mx[i][j]==mx[i][j - k - 1]: #
斜角边的值是否一致!!!!!!!! for z in range(1, k + 1): if mx[i - z][j - k - 1 + z] != mx[i
- k - 1][j]: bool = False break if bool == False: break count += 1 k += 1 else:
break # 右上直角 right,up k = 0 while k < min(right, up): bool=True if mx[i][j + k
+ 1] == mx[i - k - 1][j] and mx[i][j]==mx[i][j + k + 1]: # 斜角边的值是否一致!!!!!!!!
for z in range(1, k + 1): if mx[i - z][j + k + 1 - z] != mx[i - k - 1][j]: bool
= False break if bool == False: break count += 1 k += 1 else: break print(count)

10. 最小下标

问题描述

小蓝有一个由大写字母 ABCDEF 组成的字符串 S ,长度为 n,字符串的下标依次为 0 到 n-1 。
小蓝按照如下方法生成一个无限长的字符串:
首先选定一个 0 到 n-1 之间的数,作为初始下标。
从初始下标开始,将下标对应的字符加入到字符串的结尾,将字符的序号(A到F依次对应 1 到 6 )与下标相加作为新的下标值,如果下标大于等于 n,将其对 n
求余。重复此过程,即得到无限长的字符串。
例如,对于字符串 ACDF,当初始下标是 0 时,生成的字符串为:ACACACACAC…
再如,对于字符串 DCBA,当初始下标是 1 时,生成的字符串为:CDDDDDDDDD…
给定小蓝的字符串 S,请问当初始下标为多少时,生成的字符串最小。

输入格式
输入一行包含一个字符串。

输出格式
输出一行,包含一个整数,为所求的下标,如果有多个下标满足要求,输出最小的那个。

样例输入1
DCBA

样例输出1
3

样例输入2
AAAA

样例输出2
0

评测用例规模与约定
令 ∣ S ∣ |S|∣S∣ 表示 S SS 的长度。
对于 30 % 30\%30% 的评测用例,1 < = ∣ S ∣ < = 100 1 <= |S| <= 1001<=∣S∣<=100。
对于 50 % 50\%50% 的评测用例,1 < = ∣ S ∣ < = 1000 1 <= |S| <= 10001<=∣S∣<=1000。
对于 70 % 70\%70% 的评测用例,1 < = ∣ S ∣ < = 10000 1 <= |S| <= 100001<=∣S∣<=10000。
对于 80 % 80\%80% 的评测用例,1 < = ∣ S ∣ < = 100000 1 <= |S| <= 1000001<=∣S∣<=100000。
对于所有评测用例,1 < = ∣ S ∣ < = 1000000 1 <= |S| <= 10000001<=∣S∣<=1000000。

      关于第十题说明:暂时没有详细的解答,改日一定补上!!!

  有幸能参加了近日举行的校内选拔赛,题目虽然相对省赛和国赛要简单,但是复盘还是很有必要的,享受复盘的过程,是一点点的自我提升!!!还望广大网友看出错误能够海涵,并加予指正!!!

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信