0


第十三届蓝桥杯省赛模拟赛题解(python)

⭐️引言⭐️

    这里是不会变成少年的恶龙,如果你也喜欢刷题,那我们就是好朋友啦!交了三十大洋的蓝桥杯省赛模拟赛总算是搞完了,蓝桥杯不愧外号“圈钱杯”。

    **个人题解,仅供参考学习,有错误麻烦私信更正啦!**

1.字母A个数

问题描述

以下是一个 25 行 25 列的字母矩阵,全部由字母 A 和 B 组成。
AAAAAAABABBAABABABAAAAAAA
ABBBBBABBAABBBBBABABBBBBA
ABAAABABBBABAABBBBABAAABA
ABAAABABBBBBAABAABABAAABA
ABAAABABBABABBABABABAAABA
ABBBBBABBBABAABBBBABBBBBA
AAAAAAABABABABABABAAAAAAA
BBBBBBBBABAABABBBBBBBBBBB
AABAABABBAAABBAAABABBBBBA
ABBABABBBABBAAAABBBBAAAAB
BBBBAAABABAABABAABBBAABBA
BBAABABABAAAABBBAABBAAAAA
ABABBBABAABAABABABABBBBBA
AAAABBBBBABBBBAAABBBABBAB
AABAABAAABAAABAABABABAAAA
ABBBBBBBBABABBBBABAABBABA
ABBBAAABAAABBBAAAAAAABAAB
BBBBBBBBABBAAABAABBBABBAB
AAAAAAABBAAABBBBABABAABBA
ABBBBBABBAABABAAABBBABBAA
ABAAABABABBBAAAAAAAAAABAA
ABAAABABABABBBABBAABBABAA
ABAAABABBABBABABAABAABAAA
ABBBBBABABBBBBABBAAAABAAA
AAAAAAABAABBBAABABABBABBA
请问在这个矩阵中有多少个字母A?

答案提交

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

n=[input() for i in range(25)]      #输入字母矩阵
ans = 0                             #定义全局变量记录字母A的个数
for i in n:                         #遍历字母矩阵
    ans += i.count("A")             #记录每行字符串中字母A的个数
print(ans)                          #输出318

2.最2数字

问题描述

  如果一个整数的某个数位包含 2 ,则称这个数为一个“最2数字”。例如:102、2021 都是最2数字。
  请问在 1(含) 到 2021(含) 中,有多少个最2数字。

答案提交

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

​ans = 0                     #定义全局变量记录“最2数字”个数
for i in range(1,2022):     #遍历
    a = str(i)              #遍历的数字转换成字符串形式
    if str(2) in a:         #判断字符串里是否有2
        ans +=1             
print(ans)                  #输出564
        

3.最少操作

问题描述

    有一个整数 A=2021,每一次,可以将这个数加 1 、减 1 或除以 2,其中除以 2 必须在数是偶数的时候才允许。

  例如,2021 经过一次操作可以变成 2020、2022。
  再如,2022 经过一次操作可以变成 2021、2023 或 1011。
  请问,2021 最少经过多少次操作可以变成 1。

答案提交

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

n=int(input())       #处理输入
ans = 0              #定义变量统计操作次数
while n !=1:         #循环
    if n%2 == 0:     #如果n能整除2直接整除,否则进行下一步条件判断
        n = n//2       
        ans +=1 
    else:            #n除2的整数部分如果能整除2就减一
        if (n//2) % 2==0:
            n = n-1
            ans +=1
        else:        #否则+1
            n = n+1
            ans +=1
print(ans)           #输出最小步骤

4.螺旋矩阵

问题描述

  对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。
  例如,一个 4 行 5 列的螺旋矩阵如下:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
  请问,一个 30 行 30 列的螺旋矩阵,第 20 行第 20 列的值是多少?

答案提交

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

​n,m=map(int,input().split())     #处理输入
JZ=[[0]*m for _ in range(n)]     #初始化n行m列的二维数组
i=0                             
for k in range(0,-~max(n,m)>>1): #构造螺旋形矩阵
    for j in range(k,m-k):
        i+=1
        JZ[k][j]=i
    for j in range(k+1,n-k):
        i+=1
        JZ[j][m-k-1]=i
    for j in range(n-k-2,k,-1):
        i+=1
        JZ[n-k-1][j]=i
    for j in range(n-k-1,k,-1):
        i+=1
        JZ[j][k]=i
print(JZ[19][19])                #输出矩阵第20行20列的数字

5.二叉树深度

问题描述

  一棵二叉树有2021个结点。该树满足任意结点的左子树结点个数和右子树的结点个数之差最多为1。
  定义根结点的深度为0,子结点的深度比父结点深度多1。
  请问,树中深度最大的结点的深度最大可能是多少?

答案提交

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

盲猜11,因为2的11次方离2021最近。

6.和尚挑水

问题描述

  一个和尚要挑水,每次最多能挑 a 千克,水缸最多能装 t 千克,开始时水缸为空。
  请问这个和尚最少要挑多少次可以将水缸装满?

输入格式

  输入一行包含两个整数 a, t,用一个空格分隔。

输出格式

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

样例输入

20 2021

样例输出

102

评测用例规模与约定

  对于所有评测用例,1 <= a <= 100,1 <= t <= 10000。

​a,t=map(int,input().split())#处理输入
n=t//a                      #取整
if t%a==0:                  #判断取余是否为0,为0直接输出n,否则输出n+1
    print(n)
else:
    print(n+1)

7.千分位分隔符

问题描述

  在金融领域,通常将金额的百位和千位之间、十万位和百万位之间增加逗号(千分位分隔符),以方便阅读。一般从个位开始,每三位之前增加一个逗号。
  例如:1234567890.00 通常写成 1,234,567,890.00。
  注意小数点后固定保留 2 位。
  给定一个包含千分位分隔符的数值,请读入后输出对应的不含千分位的数值,小数点仍然保留 2 位。

输入格式

  输入一行包含一个由千分位分隔符的数值,恰好有 2 位小数。

输出格式

  输出不含千分位分隔符的数值,保留 2 位小数。

样例输入

1,234,567,890.00

样例输出

1234567890.00

评测用例规模与约定

对于所有评测用例,给定的数值整数部分不超过12位。

​a=input()
print(a.replace(",",""))   #直接利用replace函数替换掉输入里的“,”

8. 插板和插头

问题描述

  小蓝有一个插板,形状用一个 n * m 的01矩阵表示,0 表示板面,1 表示插孔。
  小蓝还有一个插头,形状用一个 r * c 的01矩阵表示,0 表示没有伸出的部分,1 表示伸出的部分。插头伸出的部分必须插在插孔里面。
  为了安全,插头插到面板上不能有任何部分超过插板边界(包括没有伸出的部分)。
  插头和插板都不能旋转,也不能翻转。请求出插头插入插板的合理位置。

输入格式

  输入的第一行包含两个整数 n, m。
  接下来 n 行,每行一个长度为 m 的01串,表示插板的形状。
  接下来一行包含两个整数 r, c。
  接下来 r 行,每行一个长度为 c 的01串,表示插头的形状。

输出格式

  如果插头没办法安全插入插板中,输出“NO”。否则输出两个数 a, b,表示插头的第 1 行第 1 列对应插板的第 a 行第 b 列。如果有多种情况满足要求,输出 a 最小的方案,如果 a 最小的方案有多个,输出在 a 最小的前提下 b 最小的方案。

样例输入

3 4
0110
0000
0000
3 3
000
010
000

样例输出

NO

样例说明

  在插头不超出范围的前提下无法插入。

样例输入

4 7
1110100
1101111
0001111
0000011
2 3
111
011

样例输出

2 4

评测用例规模与约定

  对于 50% 的评测用例,2 <= n, m, r, c <= 20。
  对于所有评测用例,2 <= n, m, r, c <= 100。

n,m=map(int,input().split())
a=tuple(tuple((bool(int(i)) for i in input())) for _ in range(n))
x,y=map(int,input().split())
b=tuple(tuple((bool(int(i)) for i in input())) for _ in range(x))
try:print(*next(chain.from_iterable(((i,j) for j in range(m-y+1) if all(all(bool.__eq__(*d) for d in zip(*c)) for c in zip((t[j:j+y] for t in a[i:i+x]),b))) for i in range(n-x+1))))
except:print('NO')

9.公约数

问题描述

  给定正整数 a, b, c,请问有多少个正整数,是其中至少两个数的约数。

输入格式

  输入一行包含三个正整数 a, b, c。

输出格式

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

样例输入

30 70 35

样例输出

6

样例说明

1、2、5、7、10、35满足条件。

评测用例规模与约定

  对于 50% 的评测用例,1 <= a, b, c <= 1000000。
  对于所有评测用例,a, b, c 不超过 10**12(10的12次方)。

​from collections import Counter     #导入模块,Counter类:为hashable对象计数,是字典的子类。
a,b,c=map(int,input().split())      #处理输入
zidian=[]                           #定义列表统计因数
x = max(a, b, c)                    #取输入最大的作为遍历范围
for i in range(1,int(x**0.5)+1):    #遍历范围到x开方+1,每次同时添加两个元素,为了减少重复计算,加快运行速度。
    if a%i==0 and i < a ** 0.5:
        zidian.append(i)            
        zidian.append(a//i)
    if b%i==0 and i < b ** 0.5:
        zidian.append(i)
        zidian.append(b//i)
    if c%i==0 and i < c ** 0.5:
        zidian.append(i)
        zidian.append(c//i)
print(sum(i>1 for i in Counter(zidian).values())) #统计重复的因数(公因数)个数并输出

10.汉诺塔游戏

问题描述

  小蓝很喜欢玩汉诺塔游戏。
  游戏中有三根柱子,开始时第一根柱子上有 n 个圆盘,从上到下圆盘的大小依次为 1 到 n。
  每次,可以将一个盘子从一根柱子上移动到另一根柱子上,这个盘子必须是柱子最上方的盘子,而且移到的柱子上的盘子必须比这个盘子大。
  小蓝的目标是将所有的盘子移动到第三根柱子上。
  汉诺塔是个经典问题,当盘子数量为 n 时,最少需要移动 2n-1 步,其中 2n 表示 2 的 n 次方。
  小蓝已经玩了一会儿(不一定按最优方案玩),他想知道,对于他目前的局面,最少还需要多少步可以到达目标。

输入格式

  输入的第一行包含三个非负整数 a, b, c,分别表示目前每根柱子上的盘子数。在本题中,n=a+b+c。
  第二行包含 a 个整数,相邻的整数之间使用一个空格分隔,表示第一根柱子上的盘子,盘子按从上到下(从小到大)的顺序给出。
  第三行包含 b 个整数,相邻的整数之间使用一个空格分隔,表示第二根柱子上的盘子,盘子按从上到下(从小到大)的顺序给出。
  第四行包含 c 个整数,相邻的整数之间使用一个空格分隔,表示第三根柱子上的盘子,盘子按从上到下(从小到大)的顺序给出。

输出格式

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

样例输入

1 2 3
1
2 3
4 5 6

样例输出

7

评测用例规模与约定

  对于 30% 的评测用例,2 <= n <= 5。
  对于所有评测用例,2 <= n <= 60。

没有思路....

标签: python 蓝桥杯

本文转载自: https://blog.csdn.net/weixin_55098579/article/details/123667028
版权归原作者 不会变成少年的恶龙 所有, 如有侵权,请联系我们删除。

“第十三届蓝桥杯省赛模拟赛题解(python)”的评论:

还没有评论