第十四届蓝桥杯校内模拟赛第一期Python组代码详解

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

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]



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。

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


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

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