第十五届蓝桥杯模拟赛第二期(Python)

目录

填空题

第一题

第二题

第三题

第四题

第五题

编程题

第六题

第七题

第八题

第九题

第十题

总结 


第二题模拟赛的试题比第一期要简单😁


填空题

第一题

解题思路

直接计算即可(在Python交互式窗口)

>>> 36 * 30 // 10
108

 最后答案为108

第二题

解题思路

题目说的很详细,用Python直接算就行(在Python命令行交换窗口输入)

>>> 2 ** 2023 % 1000
608

如果是C++语言的话,由于不自带大数处理功能,需要边运算边取余

#include <bits/stdc++.h>
using namespace std;

int main() {
    int res = 1;
    for (int i = 0; i < 2023; i++)
        res = (res * 2) % 1000;
    cout << res << endl;
    return 0;
}

最后答案是608

第三题

 解题思路

利用Python的bin()函数转化为二进制和oct()函数转化为八进制,然后累加每一位的数字的和可以很快地解决这个问题

Python中的ord()函数用来获取一个字符的ASCII码

i = 0
for _ in range(23):
    i += 1
    while sum(ord(x) - 48 for x in bin(i)[2:]) != sum(ord(x) - 48 for x in oct(i)[2:]):
        i += 1
#     print(i)
print(i)

如果不放心可以中间在中间打印 i 来查看自己写的对不对

最后答案是4169

第四题

考察:枚举、约数个数定理

 解题思路

可以直接枚举,第一层遍历每个数x,第二次从1到x检查是不是这个数的约数,但是这样会比较慢,找约数个数的过程可以用约数个数定理优化

约数个数定理:约数个数等于不同的质因数的次数加一的累乘,详细证明如图:

 详情请见百度百科:约数个数定理_百度百科 (baidu.com)

 代码

nums, mx, ans = [list(map(int, input().split())) for _ in range(6)], 0, 0

def calc(n):
    i, res = 2, 1
    while i * i <= n:
        c = 1
        while n % i == 0:
            n //= i
            c += 1
        res *= c
        i += 1
    if n > 1:
        res *= 2
    return res

if __name__ == "__main__":
    for i in range(6):
        for j in range(6):
            c = calc(nums[i][j])
            if c > mx:
                mx, ans = c, nums[i][j]
    print(ans) # 901440

最后答案是901440

题目数据

393353 901440 123481 850930 423154 240461
373746 232926 396677 486579 744860 468782
941389 777714 992588 343292 385198 876426
483857 241899 544851 647930 772403 109929
882745 372491 877710 340000 659788 658675
296521 491295 609764 718967 842000 670302

第五题

考察:搜索(DFS、BFS)

 解题思路

每次遇到 0 就将其改为 2 并且累加计数器

代码

matrix, res = [list(map(int, input())) for _ in range(30)], 0

def dfs(i, j):
    global res
    matrix[i][j] = 2
    res += 1
    for x, y in ((i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)):
        if 0 <= x < 30 and 0 <= y < 40 and matrix[x][y] == 0:
            dfs(x, y)

if __name__ == "__main__":
    dfs(0, 0)
    print(res) # 541

题目数据

0000100010000001101010101001001100000011
0101111001111101110111100000101010011111
1000010000011101010110000000001011010100
0110101010110000000101100100000101001001
0000011010100000111111001101100010101001
0110000110000000110100000000010010100011
0100110010000110000000100010000101110000
0010011010100110001111001101100110100010
1111000111101000001110010001001011101101
0011110100011000000001101001101110100001
0000000101011000010011111001010011011100
0000100000011001000100101000111011101100
0010110000001000001010100011000010100011
0110110000100011011010011010001101011011
0000100100000001010000101100000000000010
0011001000001000000010011001100101000110
1110101000011000000100011001001100111010
0000100100111000001101001000001010010001
0100010010000110100001100000110111110101
1000001001100010011001111101011001110001
0000000010100101000000111100110010101101
0010110101001100000100000010000010110011
0000011101001001000111011000100111010100
0010001100100000011000101011000000010101
1001111010010110011010101110000000101110
0110011101000010100001000101001001100010
1101000000010010011001000100110010000101
1001100010100010000100000101111111111100
1001011010101100001000000011000110110000
0011000100011000010111101000101110110001

编程题

第六题

解题思路

直接模拟即可

代码

num = input()
print(num[1:] + num[:1])

第七题

考察:模拟

解题思路

逆序遍历检查即可

代码

for i in reversed(input()):
    if i in ('a', 'e', 'i', 'o', 'u'):
        print(i)
        break

第八题

考察:模拟

 解题思路

直接模拟即可

每次重复相同的转换过程,直到n < 10为止

注意数位为0时要跳过,要不然输出结果就为0了

代码

n = int(input())
while n >= 10:
    out = 1
    for i in str(n):
        if int(i): out *= int(i)
    print(out)
    n = out

第九题

考察:搜索(DFS、BFS)

 解题思路

类似于第四题,还是遍历并标记计数

代码

def gcd(a, b):
    while b:
        a, b = b, a % b
    return a    

n, m = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(n)]
r, c = map(int, input().split())
ans = 0

def dfs(i, j):
    global ans
    ans += 1
    t, grid[i][j] = grid[i][j], 1
    for x, y in ((i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)):
        if 0 <= x < n and 0 <= y < m and gcd(t, grid[x][y]) > 1:
            dfs(x, y)

dfs(r - 1, c - 1)
print(ans)

第十题

考察:前缀和、滑动窗口

 解题思路

使用前缀和来处理数组,然后区间和就是前缀和数组中区间的尾位置元素减去区间的首位置的前一个位置的元素

详细讲解请看链接:前缀和 & 差分 - OI Wiki (oi-wiki.org)

代码

n, k = map(int, input().split())
a, pre, res = [0] + list(map(int, input().split())), [0] * (n + 1), 0
for i in range(1, n + 1):
    pre[i] = pre[i - 1] + a[i]
for i in range(k, n + 1):
    if pre[i] - pre[i - k] > res:
        res = pre[i] - pre[i - k]
print(res)

然后就可以愉快的交卷了~😁

总结 

这场考试题目还是相对比较简单的,很适合新手作为练习题使用

但是要想在蓝桥杯取的更好的成绩还是需要更多地练习更难的题,这样思维才能有更多的提升,蓝桥OJ的题库还是很不错的,虽然相比于力扣和洛谷而言没有那么完善,但是毕竟是官方的题库,对蓝桥杯的备赛是更加针对性的帮助的。

考试结果出来了,浅浅展示一下吧😁

 有什么问题欢迎在评论区留言~

  • 29
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫谨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值