第十四届蓝桥杯第三期模拟赛 【python】(一)

简介: 第十四届蓝桥杯第三期模拟赛 【python】(一)

✨最小的十六进制(python的16进制)

❓️问题描述

请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。

请将这个数的十进制形式作为答案提交。

答案提交

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

🧠思路

这道题和第一期模拟赛的第一题都是考虑到了二进制,对于python来说,还是很快的,只需要从2022开始遍历,利用python的bin函数,就可以迅速将十进制转成二进制,然后再减去首字母的两个0b即可,判断最低的6个尾数为0即可。

🖥︎参考答案

2730

i = 2023 # 从大于2022的数开始遍历
while True:
    s = hex(i)[2:] # 转化为16进制
    if s.isalpha(): # 如果全是字母返回true
        print(i,s) # 2730 aaa
        break
    i += 1

✨Excel的列(进制转化)

❓️问题描述

在 Excel 中,列的名称使用英文字母的组合。前 26 列用一个字母,依次为 A 到 Z,接下来 26*26 列使用两个字母的组合,依次为 AA 到 ZZ。

请问第 2022 列的名称是什么?

答案提交

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

🧠思路

如果以2个字母的组合为列名,最多为26x26=676个列,所以2022列就是以三个字母的组合去得到的,其实简单一点这道题也可以进行简单的手算,但是仔细一看,实际上就是2022转成26进制即可,但是这个26进制没有数字,是从A~Z。

其实这道题,我们也可以列一个数组,穷举把所有数算出来,然后取对应位置2022的数据出来就好了,这两种方法都OK的。

🖥︎参考答案

BYT

转化为26进制

def to_base_26(num):
    """
    Convert an integer to base 26.
    """
    if num == 0:
        return 'A' # 如果为0 
    letters = []
    while num > 0:
        num, rem = divmod(num, 26)
        letters.append(chr(ord('A') + rem - 1)) 
    return ''.join(reversed(letters)) # 进行翻转
print(to_base_26(2022))

穷举法

def get(x, y, z):
    return x * 26 * 26 + y * 26 + z
def ans(x, y, z):
    s = ''
    s += chr(ord('A') + x - 1)
    s += chr(ord('A') + y - 1)
    s += chr(ord('A') + z - 1)
    return s
n = 2022
for i in range(1, 27):
    for j in range(1, 27):
        for k in range(1, 27):
            if get(i, j, k) == n:
                print(ans(i, j, k))
                exit()


✨相等日期(datetime日期)

❓️问题描述

对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。

例如,2022年11月13日满足要求,因为 2+0+2+2=(1+1)+(1+3) 。

请提交满足条件的日期的总数量。

答案提交

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

🧠思路

这道题最简单的话,就是可以利用python的datetime库进行判断,转成字符串进行计数,最后把符合条件的结果计数输出就是最后日期的总数量。

🖥︎参考答案

70910

import datetime
start = datetime.date(1900,1,1)
end = datetime.date(9999,12,31)
# 把字符串转为会数字,2022转化为2+0+2+2=6
def get_num(n):
    return sum([int(i) for i in str(n)])
cnt = 0
while start < end:
    y,m,d = start.year, start.month, start.day
    if get_num(y) == get_num(m) + get_num(d):
        cnt += 1
    start += datetime.timedelta(days=1)
print(cnt) # 70910

✨多少种取法(简单模拟)

❓️问题描述

小蓝有 30 个数,分别为:99, 22, 51, 63, 72, 61, 20, 88, 40, 21, 63, 30, 11, 18, 99, 12, 93, 16, 7, 53, 64, 9, 28, 84, 34, 96, 52, 82, 51, 77

小蓝可以在这些数中取出两个序号不同的数,共有 30*29/2=435 种取法。

请问这 435 种取法中,有多少种取法取出的两个数的乘积大于等于 2022 。

答案提交

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

🧠思路

这道题其实很简单的,就是随机取两个数,然后进行判断,如果符合条件的话计数,最后就把结果输出即可

🖥︎参考答案

189

nums = [0, 99, 22, 51, 63, 72, 61, 20, 88, 40,
  21, 63, 30, 11, 18, 99, 12, 93, 16, 7, 53,
  64, 9, 28, 84, 34, 96, 52, 82, 51, 77]
cnt = 0
for i in range(1,31):
    for j in range(i+1,31):
        if nums[i]*nums[j] >= 2022: # >=2022
            cnt += 1
print(cnt) # 189

✨最大连通分块(DFS)

❓️问题描述

小蓝有一个 30 行 60 列的数字矩阵,矩阵中的每个数都是 0 或 1 。如果从一个标为 1 的位置可以通过上下左右走到另一个标为 1 的位置,则称两个位置连通。与某一个标为 1 的位置连通的所有位置(包括自己)组成一个连通分块。

请问矩阵中最大的连通分块有多大?

110010000011111110101001001001101010111011011011101001111110
010000000001010001101100000010010110001111100010101100011110
001011101000100011111111111010000010010101010111001000010100
101100001101011101101011011001000110111111010000000110110000
010101100100010000111000100111100110001110111101010011001011
010011011010011110111101111001001001010111110001101000100011
101001011000110100001101011000000110110110100100110111101011
101111000000101000111001100010110000100110001001000101011001
001110111010001011110000001111100001010101001110011010101110
001010101000110001011111001010111111100110000011011111101010
011111100011001110100101001011110011000101011000100111001011
011010001101011110011011111010111110010100101000110111010110
001110000111100100101110001011101010001100010111110111011011
111100001000001100010110101100111001001111100100110000001101
001110010000000111011110000011000010101000111000000110101101
100100011101011111001101001010011111110010111101000010000111
110010100110101100001101111101010011000110101100000110001010
110101101100001110000100010001001010100010110100100001000011
100100000100001101010101001101000101101000000101111110001010
101101011010101000111110110000110100000010011111111100110010
101111000100000100011000010001011111001010010001010110001010
001010001110101010000100010011101001010101101101010111100101
001111110000101100010111111100000100101010000001011101100001
101011110010000010010110000100001010011111100011011000110010
011110010100011101100101111101000001011100001011010001110011
000101000101000010010010110111000010101111001101100110011100
100011100110011111000110011001111100001110110111001001000111
111011000110001000110111011001011110010010010110101000011111
011110011110110110011011001011010000100100101010110000010011
010011110011100101010101111010001001001111101111101110011101

答案提交

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

🧠思路

这道题是一道

🖥︎参考答案

148

import sys
sys.setrecursionlimit(1<<31-1)
matrix = '''110010000011111110101001001001101010111011011011101001111110
010000000001010001101100000010010110001111100010101100011110
001011101000100011111111111010000010010101010111001000010100
101100001101011101101011011001000110111111010000000110110000
010101100100010000111000100111100110001110111101010011001011
010011011010011110111101111001001001010111110001101000100011
101001011000110100001101011000000110110110100100110111101011
101111000000101000111001100010110000100110001001000101011001
001110111010001011110000001111100001010101001110011010101110
001010101000110001011111001010111111100110000011011111101010
011111100011001110100101001011110011000101011000100111001011
011010001101011110011011111010111110010100101000110111010110
001110000111100100101110001011101010001100010111110111011011
111100001000001100010110101100111001001111100100110000001101
001110010000000111011110000011000010101000111000000110101101
100100011101011111001101001010011111110010111101000010000111
110010100110101100001101111101010011000110101100000110001010
110101101100001110000100010001001010100010110100100001000011
100100000100001101010101001101000101101000000101111110001010
101101011010101000111110110000110100000010011111111100110010
101111000100000100011000010001011111001010010001010110001010
001010001110101010000100010011101001010101101101010111100101
001111110000101100010111111100000100101010000001011101100001
101011110010000010010110000100001010011111100011011000110010
011110010100011101100101111101000001011100001011010001110011
000101000101000010010010110111000010101111001101100110011100
100011100110011111000110011001111100001110110111001001000111
111011000110001000110111011001011110010010010110101000011111
011110011110110110011011001011010000100100101010110000010011
010011110011100101010101111010001001001111101111101110011101'''
matrix = matrix.split('\n')
matrix = list(map(list,matrix))
n,m = len(matrix), len(matrix[0])
f = [(-1,0),(1,0),(0,-1),(0,1)]
def dfs(x,y):
    global cnt
    matrix[x][y] = '0'
    cnt += 1
    for fx,fy in f:
        nx,ny = x + fx, y + fy
        if 0<=nx<n and 0<=ny<m and matrix[nx][ny] == '1':
            dfs(nx,ny) # 进行深搜
ans = 0
for i in range(n):
    for j in range(m):
        if matrix[i][j] == '1':
            cnt = 0 # 求取连通分量
            dfs(i,j) 
            ans = max(ans,cnt) # 取最大连通分量
print(ans)

✨哪一天(模拟题)

❓️问题描述

给定一天是一周中的哪天,请问 n 天后是一周中的哪天?

输入格式

输入第一行包含一个整数 w,表示给定的天是一周中的哪天,w 为 1 到 6 分别表示周一到周六,w 为 7 表示周日。

第二行包含一个整数 n。

输出格式

输出一行包含一个整数,表示 n 天后是一周中的哪天,1 到 6 分别表示周一到周六,7 表示周日。

样例输入

6
10


样例输出

2

评测用例规模与约定

对于所有评测用例,1 < = n < = 1000000 1 <= n <= 10000001<=n<=1000000。


🧠思路

这道题实际上就是模拟题,首先我们可以认为是0~6分别代表周一到周日,我们只需要把(当前星期+n天数%7)就可以得到n天后是周几,由于是0-indexing的,所以+1转成1-indexing

🖥︎参考代码

w = int(input())
n = int(input())
print((w-1+n)%7+1)

✨信号覆盖(暴力模拟)

❓️问题描述

小蓝负责一块区域的信号塔安装,整块区域是一个长方形区域,建立坐标轴后,西南角坐标为 (0, 0), 东南角坐标为 (W, 0), 西北角坐标为 (0, H), 东北角坐标为 (W, H)。其中 W, H 都是整数。

他在 n 个位置设置了信号塔,每个信号塔可以覆盖以自己为圆心,半径为 R 的圆形(包括边缘)。

为了对信号覆盖的情况进行检查,小蓝打算在区域内的所有横纵坐标为整数的点进行测试,检查信号状态。其中横坐标范围为 0 到 W,纵坐标范围为 0 到 H,总共测试 (W+1) * (H+1) 个点。

给定信号塔的位置,请问这 (W+1)*(H+1) 个点中有多少个点被信号覆盖。

输入格式

输入第一行包含四个整数 W, H, n, R,相邻整数之间使用一个空格分隔。

接下来 n 行,每行包含两个整数 x, y,表示一个信号塔的坐标。信号塔可能重合,表示两个信号发射器装在了同一个位置。

输出格式

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

样例输入

10 10 2 5
0 0
7 0

样例输出

57

评测用例规模与约定

对于所有评测用例,1 <= W, H <= 100,1 <= n <= 100, 1 <= R <= 100, 0 <= x <= W, 0 <= y <= H。

🧠思路

这道题实际上一看下来,就是一个暴力模拟的题目了,只需要循环这(W+1)*(H+1)个点,查看有哪些被信号覆盖即可,所以这道题可以直接穷举,看题目的一个数量级不大,所以O ( n 3 ) O(n^3)O(n

)应该也是没问题的,我稍微改进了一下简单的穷举,我只对每一个信号塔周边的区域进行判断。也可以遍历所有的点,然后遍历所有的信号塔查看是否有覆盖,但是那个可能就会代码简单,时间复杂一点

🖥︎参考代码

w,h,n,R = map(int,input().split())
def dist(x1,y1,x2,y2):
    return ((x1-x2)**2+(y1-y2)**2)**0.5
flag = [[0]*(h+1) for _ in range(w+1)] # flag[i][j]表示是否有记录过
cnt = 0
for k in range(n):
    x,y = map(int,input().split())
    for i in range(x-R,x+R+1):
        for j in range(y-R,y+R+1):
            if 0<=i<=w and 0<=j<=h and flag[i][j]==0 and dist(i,j,x,y) <= R:
                flag[i][j] = 1 # 标记代表已经记录过被覆盖了
                cnt += 1
print(cnt)

第十四届蓝桥杯第三期模拟赛 【python】(二):https://developer.aliyun.com/article/1410168

相关文章
|
5月前
|
存储 索引 Python
蓝桥杯系列2——python基本语法
蓝桥杯系列2——python基本语法
68 0
|
3月前
|
索引 Python 容器
【备战蓝桥杯】探索Python内置标准库collections的使用
【备战蓝桥杯】探索Python内置标准库collections的使用
49 1
|
3月前
|
开发者 Python
【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数
【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数
33 1
|
3月前
|
算法 测试技术 编译器
蓝桥杯-02-python组考点与14届真题
蓝桥杯-02-python组考点与14届真题
|
3月前
|
Python
第十三届蓝桥杯B组python(试题A:排列字母)
第十三届蓝桥杯B组python(试题A:排列字母)
25 0
|
3月前
|
人工智能 算法 测试技术
第十四届蓝桥杯第三期模拟赛 【python】(二)
第十四届蓝桥杯第三期模拟赛 【python】(二)
|
3月前
|
人工智能 算法 测试技术
第十四届蓝桥杯第二期模拟赛 【python】
第十四届蓝桥杯第二期模拟赛 【python】
|
5月前
|
机器学习/深度学习 开发者 索引
蓝桥杯系列6——python技巧
蓝桥杯系列6——python技巧
90 0
|
5月前
|
算法 Python
蓝桥杯系列4——python基础练习
蓝桥杯系列4——python基础练习
121 0
|
人工智能 Python
Python 蓝桥杯 动态规划 2道例题+配套1道历年真题
Python 蓝桥杯 动态规划 2道例题+配套1道历年真题
90 0
Python 蓝桥杯 动态规划 2道例题+配套1道历年真题