【算法训练题型】 题解
【蓝桥杯2022年真题】题解

1 进制转换

问题描述
  请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。
  请将这个数的十进制形式作为答案提交。

答案:2730

def check(num):t = []while num:k = num % 16t.append(chr(k + ord('0') if k < 10 else ord('A')))num //= 16if ''.join(t).isalpha():return Trueelse:return Falsefor i in range(2022, 100000):if check(i):print(i)break

2 思维

问题描述
  在 Excel 中,列的名称使用英文字母的组合。前 26 列用一个字母,依次为 A 到 Z,接下来 26*26 列使用两个字母的组合,依次为 AA 到 ZZ。
  请问第 2022 列的名称是什么?
A ~ Z
AA ~ ZZ: AA ~ AZ BA ~ BZ CA ~ CZ
AAA ~ ZZZ: AAA ~ AAZ …
答案:BYU

t = 2022 - 26 - 26 * 26
div, mod = divmod(t, 26 * 26)
a, b = divmod(mod, 26)
print(div, mod)
print(a, b)
print(chr(ord('A') + a), chr(ord('A') + b))
# 验证
print(26 + 26 * 26 + 26 * 26 + 24 * 26 + 20)

3 日期问题

问题描述
  对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。
  例如,2022年11月13日满足要求,因为 2+0+2+2=(1+1)+(1+3) 。
  请提交满足条件的日期的总数量。

答案:
70910


def is_leap(year):return year % 100 != 0 and year % 4 == 0 or year % 400 == 0def check(y, m, d):dsy = sum(int(i) for i in str(y))dsm = sum(int(i) for i in str(m))dsd = sum(int(i) for i in str(d))return dsy == dsm + dsdma = [[0, 0], [31, 31], [28, 29], [31, 31], [30, 30], [31, 31], [30, 30], [31, 31], [31, 31], [30, 30], [31, 31], [30, 30], [31, 31]]
cy, cm, cd = 1900, 1, 1
dy, dm, dd = 9999, 12, 31
ans = 0
while cy != dy or cm != dm or cd != dd:cd += 1if cd > ma[cm][is_leap(cy)]:cd = 1cm += 1if cm > 12:cm = 1cy += 1#print(cy, cm, cd, ans)if check(cy, cm, cd):ans += 1print(check(2022, 11, 13))
print(ans)

4 遍历

问题描述
  小蓝有 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


a = [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]
ans = 0
cnt = 0
for i in range(30):for j in range(i + 1, 30):cnt += 1if a[i] * a[j] >= 2022:ans += 1
print(cnt, ans)

5 搜索

问题描述
  小蓝有一个 30 行 60 列的数字矩阵,矩阵中的每个数都是 0 或 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
  如果从一个标为 1 的位置可以通过上下左右走到另一个标为 1 的位置,则称两个位置连通。与某一个标为 1 的位置连通的所有位置(包括自己)组成一个连通分块。
  请问矩阵中最大的连通分块有多大?
答案: 148

def dfs(x, y):global cur, visfor i, j in [[0, 1], [1, 0], [-1, 0], [0, -1]]:dx = i + xdy = j + yif dx < 0 or dy < 0 or dx >= 30 or dy >= 60 or mp[dx][dy] == '0' or vis[dx][dy]:continuecur += 1vis[dx][dy] = 1dfs(dx, dy)n, m = 30, 60
mp = []
for _ in range(n):mp.append(input())vis = [[0] * m for _ in range(n)]
ans, cur = 0, 0for i in range(n):for j in range(m):if mp[i][j] == '0':continuevis = [[0] * m for _ in range(n)]vis[i][j] = 1cur = 1dfs(i, j)ans = max(ans, cur)print(ans)

6 签到

问题描述
  给定一天是一周中的哪天,请问 n 天后是一周中的哪天?
输入格式
  输入第一行包含一个整数 w,表示给定的天是一周中的哪天,w 为 1 到 6 分别表示周一到周六,w 为 7 表示周日。
  第二行包含一个整数 n。
输出格式
  输出一行包含一个整数,表示 n 天后是一周中的哪天,1 到 6 分别表示周一到周六,7 表示周日。
样例输入
6
10
样例输出
2
评测用例规模与约定
  对于所有评测用例,1 <= n <= 1000000。

w = int(input())
n = int(input())
x = (w + n) % 7
print(x if x > 0 else 7)

7 遍历

问题描述
  小蓝负责一块区域的信号塔安装,整块区域是一个长方形区域,建立坐标轴后,西南角坐标为 (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。

解析:遍历矩阵中的每个点,每个点与每个圆心求个距离,判断是否小于等于R即可

def check(x, y):for i in range(n):if (x - point[i][0]) ** 2 + (y - point[i][1]) ** 2 <= r * r:return Truereturn Falsew, h, n, r = map(int, input().split())
point = []
for _ in range(n):row = list(map(int, input().split()))point.append(row)ans = 0
for i in range(w + 1):for j in range(h + 1):if check(i, j):ans += 1
print(ans)

8 暴力

问题描述
  小蓝有一个 n * m 大小的矩形水域,小蓝将这个水域划分为 n 行 m 列,行数从 1 到 n 标号,列数从 1 到 m 标号。每行和每列的宽度都是单位 1 。
  现在,这个水域长满了水草,小蓝要清理水草。
  每次,小蓝可以清理一块矩形的区域,从第 r1 行(含)到第 r2 行(含)的第 c1 列(含)到 c2 列(含)。
  经过一段时间清理后,请问还有多少地方没有被清理过。
输入格式
  输入第一行包含两个整数 n, m,用一个空格分隔。
  第二行包含一个整数 t ,表示清理的次数。
  接下来 t 行,每行四个整数 r1, c1, r2, c2,相邻整数之间用一个空格分隔,表示一次清理。请注意输入的顺序。
输出格式
  输出一行包含一个整数,表示没有被清理过的面积。
样例输入
2 3
2
1 1 1 3
1 2 2 2
样例输出
2
样例输入
30 20
2
5 5 10 15
6 7 15 9
样例输出
519
评测用例规模与约定
  对于所有评测用例,1 <= r1 <= r2 <= n <= 100, 1 <= c1 <= c2 <= m <= 100, 0 <= t <= 100。

解析:
暴力:数据量不大

n, m = map(int, input().split())
vis = [[1] * m for _ in range(n)]
for _ in range(int(input())):r1, c1, r2, c2 = map(int, input().split())for i in range(r1 - 1, r2):for j in range(c1 - 1, c2):vis[i][j] = 0ans = 0
for i in range(n):for j in range(m):ans += vis[i][j]
print(ans)

9 搜索

问题描述
  小蓝准备在一个空旷的场地里面滑行,这个场地的高度不一,小蓝用一个 n 行 m 列的矩阵来表示场地,矩阵中的数值表示场地的高度。
  如果小蓝在某个位置,而他上、下、左、右中有一个位置的高度(严格)低于当前的高度,小蓝就可以滑过去,滑动距离为 1 。
  如果小蓝在某个位置,而他上、下、左、右中所有位置的高度都大于等于当前的高度,小蓝的滑行就结束了。
  小蓝不能滑出矩阵所表示的场地。
  小蓝可以任意选择一个位置开始滑行,请问小蓝最多能滑行多远距离。
输入格式
  输入第一行包含两个整数 n, m,用一个空格分隔。
  接下来 n 行,每行包含 m 个整数,相邻整数之间用一个空格分隔,依次表示每个位置的高度。
输出格式
  输出一行包含一个整数,表示答案。
样例输入
4 5
1 4 6 3 1
11 8 7 3 1
9 4 5 2 1
1 3 2 2 1
样例输出
7
样例说明
  滑行的位置一次为 (2, 1), (2, 2), (2, 3), (3, 3), (3, 2), (4, 2), (4, 3)。
评测用例规模与约定
  对于 30% 评测用例,1 <= n <= 20,1 <= m <= 20,0 <= 高度 <= 100。
  对于所有评测用例,1 <= n <= 100,1 <= m <= 100,0 <= 高度 <= 10000。

遍历每个位置,从该位置起进行dfs,dfs的每一层就是小蓝的滑行距离。


def dfs(x, y, vis, layer):global ansfor i, j in [[0, 1], [1, 0], [-1, 0], [0, -1]]:dx, dy = i + x, j + yif dx < 0 or dy < 0 or dx >= n or dy >= m or vis[dx][dy] or mp[x][y] <= mp[dx][dy]:continuevis[dx][dy] = 1dfs(dx, dy, vis, layer + 1)vis[dx][dy] = 0ans = max(ans, layer)n, m = map(int, input().split())
mp = []
for _ in range(n):row = list(map(int, input().split()))mp.append(row)ans = 0
for i in range(n):for j in range(m):vis = [[0] * m for _ in range(n)]vis[i][j] = 1dfs(i, j, vis, 1)
print(ans)

10 线段树+区间最大值

问题描述
  小蓝有一个序列 a[1], a[2], …, a[n]。
  给定一个正整数 k,请问对于每一个 1 到 n 之间的序号 i,a[i-k], a[i-k+1], …, a[i+k] 这 2k+1 个数中的最小值是多少?当某个下标超过 1 到 n 的范围时,数不存在,求最小值时只取存在的那些值。
输入格式
  输入的第一行包含一整数 n。
  第二行包含 n 个整数,分别表示 a[1], a[2], …, a[n]。
  第三行包含一个整数 k 。
输出格式
  输出一行,包含 n 个整数,分别表示对于每个序号求得的最小值。
样例输入
5
5 2 7 4 3
1
样例输出
2 2 2 3 3
评测用例规模与约定
  对于 30% 的评测用例,1 <= n <= 1000,1 <= a[i] <= 1000。
  对于 50% 的评测用例,1 <= n <= 10000,1 <= a[i] <= 10000。
  对于所有评测用例,1 <= n <= 1000000,1 <= a[i] <= 1000000。


def build(rt, l, r):global treeif l == r:tree[rt] = arr[l]returnm = (l + r) >> 1build(rt << 1, l, m)build(rt << 1 | 1, m + 1, r)tree[rt] = min(tree[rt << 1], tree[rt << 1 | 1])def query_mi(rt, l, r, L, R):if L <= l and r <= R:return tree[rt]m = (l + r) >> 1ans = infif L <= m:ans = min(ans, query_mi(rt << 1, l, m, L, R))if m < R:ans = min(ans, query_mi(rt << 1 | 1, m + 1, r, L, R))return ansn = int(input())
arr = list(map(int, input().split()))
arr.insert(0, 0)
k = int(input())
inf = 1000000 + 5
tree = [inf] * (n * 4)
ans = []
build(1, 1, n)
for i in range(1, n + 1):l = i - k if i - k > 0 else 1r = i + k if i + k <= n else nans.append(query_mi(1, 1, n, l, r))for i in range(n):print(ans[i], end=" ")

第十四届蓝桥杯模拟赛【第三期】Python相关推荐

  1. 竞赛——【蓝桥杯】2022年11月第十四届蓝桥杯模拟赛第一期Python

    1.二进制位数 问题描述 十进制整数 2 在十进制中是 1 位数,在二进制中对应 10 ,是 2 位数. 十进制整数 22 在十进制中是 2 位数,在二进制中对应 10110 ,是 5 位数. 请问十 ...

  2. 2022 第十四届蓝桥杯模拟赛第一期(题解与标程)

    第十四届蓝桥杯模拟赛第一期 1. 二进制位数 问题描述 答案提交 参考答案 2. 晨跑 问题描述 答案提交 参考答案 3. 调和级数 问题描述 答案提交 参考答案 程序验证 4. 山谷 问题描述 答案 ...

  3. 第十四届蓝桥杯模拟赛(第三期)Java组个人题解

    第十四届蓝桥杯模拟赛(第三期)Java组个人题解

  4. 第十四届蓝桥杯模拟赛第一期试题【Java解析】

    目录 A 二进制位数 问题描述 答案提交 参考答案 解析 B 晨跑 问题描述 答案提交 参考答案 解析 C 调和级数 问题描述 答案提交 参考答案 解析 D 山谷 问题描述 答案提交 参考答案 解析 ...

  5. 第十四届蓝桥杯模拟赛(第一期)——C语言版

    1. 二进制位数 问题描述 十进制整数 2 在十进制中是 1 位数,在二进制中对应 10 ,是 2 位数. 十进制整数 22 在十进制中是 2 位数,在二进制中对应 10110 ,是 5 位数. 请问 ...

  6. 2022年第十四届蓝桥杯模拟赛【核酸日期】C语言详解

    目录 题目 思路 代码实现 题目 核酸日期 问题描述 如果周一做核酸,周二显示核酸天数为 1 天,周三显示 2 天,以此类推,周六显示 5 天,周日显示 6 天. 小蓝在某一天做了一次核酸,请问他的核 ...

  7. 第十四届蓝桥杯模拟赛(Python)

    写在前面 本篇题解涵盖范围为1 - 8 题,最后两题本人没能解出来 使用语言为Python 过样例 不确定能否AC 仅供参考 若有错误 欢迎指出 最后两题若有佬会 可以评论给出你的思路 感激不尽

  8. 第十四届蓝桥杯模拟赛c++ 试题 I

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

  9. 第十四届蓝桥杯省赛C/C++研究生组试题及答案分享

    填空2题:与或异或 图中的每个三角形为:与.或.异或这三种运算中的一种,请问对于输入为{1,0,1,0,1}时,使得输出为1的三角运算符的组合有多少种? 思路:遍历每个三角,使其为与.或.异或的一种, ...

最新文章

  1. 【C++】二叉树的先序、中序、后序遍历序列
  2. Python中调用Linux命令并获取返回值
  3. fetch vue读取json文件_前端笔记——尝试理解并在JavaScript中使用Fetch()
  4. 存储服务器的操作系统,存储服务器是什么操作系统
  5. docker建多个mysql_《容器化系列二》利用Docker容器化技术安装多个mysql
  6. QML Profiler性能优化教程
  7. 北方华创:「8大报表应用场景」助力全方位数字化管理
  8. 用java打出矩形阵型的数字_java输出数字发散矩形
  9. java 密码规则_密码规则(正则表达式)
  10. PAT 1081. 检查密码 (15) - 乙级
  11. 使用minio搭建文件服务器,MinIO文件服务器构建
  12. Scala 隐式转换和隐式参数
  13. StylesheetLanguage--如何使用Less--前端样式语言
  14. java keytool 生成p12证书
  15. 如何将ANSYS19 Structural 图形界面背景底色更改为白色
  16. python四子棋游戏
  17. 2019icpc南京网络赛 Holy Grail(SPFA)
  18. 相同元素分配到相同空间问题(放鸡蛋问题)详解
  19. AGC中振幅与dB的转换关系
  20. 【收集】NLP语料库数据集+持续更新

热门文章

  1. 怎样修改带密码的还原精灵
  2. 实现一个机器人陪女友自动聊天(不用写一行代码),终于可以安心“打农药”啦
  3. 零信任-深信服零信任aTrust介绍(5)
  4. 嵌入式软件工程师面试题(七)
  5. CentOS7架设服务器系列
  6. ASIO4ALL是什么
  7. 2016,解密百度排名规则与算法
  8. OpenCV Face Recognition山寨版
  9. 电解电容的寿命有多长?
  10. LabVIEW使用NIPM安装软件报错