2021年蓝桥杯省赛A组题解(python组)

来自微信公众号:算法梦工厂,二维码见文末。
欢迎加入蓝桥杯备赛群:768245918,获取往届试题,测试数据,算法课程等相关资源。

A:卡片

答案:3181

解析

  • 涉及知识点:枚举
  • 做法:因为首先到达2021张的一定是数字‘1’,所以只需要统计1的个数就可以。
num=0
for i in range(1,10000):num+=str(i).count("1")if 2021 == num:print(i)break

B:直线

答案:40257

解析

可以求每条的斜率k和截距b,然后进行去重。

# -*- coding:UTF-8 -*-
# 斜率: k = (y2 - y1) / (x2 - x1)
# 截距:b = - k * x1 + y1 = (x2 * y1 - x1 * y2) / (x2 - x1)points = [[i, j] for i in range(20) for j in range(21)]  # 每个点的坐标
res = set()  # 储存结果,并且进行去重
for i in range(len(points)):x1, y1 = points[i][0], points[i][1]for j in range(i, len(points)):x2, y2 = points[j][0], points[j][1]if x1 == x2:  # 斜率为无穷时不进行计算continuek = (y2 - y1) / (x2 - x1)b = (x2 * y1 - x1 * y2) / (x2 - x1)if (k, b) not in res:res.add((k, b))
print(len(res) + 20)40257

C:货物摆放

解析

通过分解质数来进行计算,把所有的质数对存储起来,然后进行筛选。

# -*- coding:UTF-8 -*-
import time
start = time.perf_counter()
n = int(input())
docker = set()
for i in range(1, int(n ** 0.5) + 1):if n % i == 0:docker.add(i)docker.add(n // i)
ans = 0
for i in docker:for j in docker:for k in docker:if i * j * k == n:ans += 1
print(ans)
end = time.perf_counter()
print(f"Running time: {end - start} Seconds")2021041820210418
2430

D:路径

解析

主要思想就是求解最小公倍数,然后再加上一个判断就可以

  1. 建图:共2021个结点组成的图,枚举任意两点组合,通过计算最大公约数,记录这两个点之间的距离,即增加一条边。
  2. 最短路求解:可以使用Floyd算法或DijkStra算法计算最短路。(这里因为是填空题,建议使用Floyd算法更加好写,可以考虑两个算法都实现用来相互验证)
import mathdef func(x, y):x1, y1 = x, ywhile y1:x1, y1 = y1, x1 % y1  # x1为最大公约数return x * y // x1n = int(input())
dp = [float('inf')] * (n + 1)
dp[1] = 0
for i in range(1, n + 1):for j in range(i + 1, i + 22):if j > n:   # 跳出循环breakdp[j] = min(dp[j], dp[i] + func(i, j))
print(dp[n])2021
10266837

E:回路计数

解析

详见https://mp.weixin.qq.com/s/IsJKGLMkFMKOAlu5YE2mrw试题E

# -*- coding:UTF-8 -*-
from math import gcd
n = int(input())
m = 1 << n
dp = [[0 for j in range(n)] for i in range(m)]  # dp[i][j]对于状态i,i的二进制表示中为1的位置 表示走过了教学楼j
load = [[False for j in range(n)] for i in range(n)]  # 存储i, j之间是否有路
for i in range(1, n + 1):for j in range(1, n + 1):if gcd(i, j) == 1:load[i - 1][j - 1] = True
dp[1][0] = 1
for i in range(1, m):  # 枚举每一种状态for j in range(n):if i >> j & 1:  # 判断状态i是否包含第j栋教学楼for k in range(n):  # 枚举所有可能从教学楼k走到教学楼j的情况if i - (1 << j) >> k & 1 and load[k][j]:  # 判断状态i除去j后是否包含kdp[i][j] += dp[i - (1 << j)][k]
print(sum(dp[m - 1]) - dp[m - 1][0])21
881012367360

F:时间显示


解析

简单模拟计算即可

# -*- coding:UTF-8 -*-
n = int(input())
n //= 1000   # 消除毫秒的影响
day_second = 24 * 60 * 60  # 一天的秒数
n_sencond = n % day_second      # 此时的n为一天之内的秒数
second = n % 60    # 输出秒数n_minute = n_sencond // 60  # 计算剩下的分钟
minute = n_minute % 60   # 输出分钟n_time = n_minute // 60  # 计算小时
times = n_time
print('%.2d:%.2d:%.2d' % (times, minute, second))46800999
13:00:001618708103123
01:08:23

G:杨辉三角形


解析

数据范围其实比较小,直接计算即可

# -*- coding:UTF-8 -*-
def find_n(n):if n == 1:return 1res = 3  # 已计算过的个数li, l = [1, 2], 3  # 将要进行比对的行的元素及其行数while n not in li:res += len(li) * 2 - l % 2li, l = [1] + [li[i] + li[i + 1] for i in range(len(li) - 1)] + ([li[-1] * 2] if l % 2 == 0 else []), l + 1return res + li.index(n) + 1if __name__ == '__main__':n = int(input())print(find_n(n))6
13

H:左孩子右兄弟

解析

可以发现左孩子右兄弟的存储方法,对于树上的一个节点,它的所有儿子都会按照某种顺序依次成为它的右儿子,右儿子的右儿子,右儿子的右儿子的右儿子…依次类推深度不断增加。所以这里就有一个递归的结论:对于一个节点,只有把它的所有儿子形成的子树中,转化为二叉树深度最深的儿子放到最下边,才会最优。所以对于每个结点的所有儿子顺序选择,只需要选择它的儿子形成的子树中转化成二叉树高度最高的放到最后边就能得到最优答案。

树形DP:

f[u]:以点 u 为根节点,通过 “左孩子右兄弟” 表示法转化成二叉树后的最大高度;

  • f[u] = 子节点数量 + 子树转化为二叉树后的最大高度

import sys
sys.setrecursionlimit(100000)
g = [[]for i in range(10**5+10)]
def dfs(u):ans = 0cnt = len(g[u])for i in range(0, len(g[u])):ans = max(ans, dfs(g[u][i]) + cnt)return ansn = int(input())for i in range(2, n + 1):tmp = int(input())g[tmp].append(i)
ans = dfs(1)
print(ans)

I:异或数列

解析

  1. 涉及知识点:动态规划,取模
  2. 动态规划设计:
    • 状态设计: dp(i,j)dp(i,j)dp(i,j) 表示前 iii 个括号插入若干个括号之后,左括号比右括号多 jjj 个的插入方法数。
    • 状态转移方程: dp(i,j)=dp(i−1,j−1)dp(i,j) = dp(i-1,j-1)dp(i,j)=dp(i−1,j−1)(stristr_istri​ 是左括号), dp(i,j)=∑k=0j+1dp(i−1,k)dp(i,j) = \sum_{k=0}^{j+1}dp(i-1,k)dp(i,j)=∑k=0j+1​dp(i−1,k) ( stristr_istri​ 是右括号)
    • 状态转移优化:当 stristr_istri​ 是右括号时,因为: dp(i,j−1)=∑k=0jdp(i−1,k)dp(i,j-1) = \sum_{k=0}^{j}{dp(i-1,k)}dp(i,j−1)=∑k=0j​dp(i−1,k) ,所以 dp(i,j)=dp(i−1,j+1)+dp(i,j−1)dp(i,j) = dp(i-1,j+1) + dp(i,j-1)dp(i,j)=dp(i−1,j+1)+dp(i,j−1) 。相当于是利用一个前缀和来把 O(n)O(n)O(n) 的状态转移方程优化成 O(1)O(1)O(1) 。
    • 初始状态: dp(0,0)=1dp(0,0) = 1dp(0,0)=1
  3. 注意事项:要增加 visvisvis 数组用于表示 dpdpdp 数组每个位置取模前的实际值是否为 000 ,如果只判断 dpdpdp 值可能会出现 dpdpdp 值实际不为 000 但是因为取模恰好为 000 的情况(虽然因为这个模数的特殊性,这个情况出现的概率几乎为 000 )

代码

num = [0] * 50
def add(x):cnt = 0while x > 0:if x & 1:num[cnt] += 1cnt += 1x >>= 1T = int(input())while(T):T -= 1xorSum = 0num = [0] * 50tmp = list(map(int, input().split()))n = tmp[0]for i in range(n):add(tmp[i + 1])xorSum ^= tmp[i + 1]if xorSum == 0:print(0)continueans = 0pos = 0for i in range(30, -1, -1):if (num[i] & 1):pos = ibreakif ((n & 1) or (num[pos] == 1)):print(1)else:print(-1)

J:括号序列

解析

同c++A组括号序列

括号序列的性质

(1) 左、右括号的数量相等

(2) 任意前缀的左括号数量必须大于等于右括号数量

最少需要添加括号的数量

(1) 为了尽可能添加少的括号,所以添加的左、右括号不会出现如同“()”的形式。

(2) 从前往后遍历,当前前缀中,若左括号的数量小于右括号的数量,则需要添加对应数量的左括号,若遍历结束后左括号数量大于右括号,则需要添加对应数量的右括号。

添加括号的方案

(1)左括号与右括号添加的位置方案是相互独立的,不会相互影响,即使左、右括号添加在同一个间隙,因为不能存在"()“的形式,此处只能为类似”))(("的一种形式,故总的方案数等于左括号的方案数 × 右括号的方案数。

(2)单独考虑添加左括号,若以右括号为分割点, 将整个序列进行分割,因为分割后的子串中均为左括号, 添加任意数目的左括号方案数均为一种,那么此时,我们仅需考虑添加不同数量的左括号的方案数即可。

(3)右括号同理

动态规划:

f[i][j]的状态表示:

(1)集合:只考虑前 i 部分,左括号比右括号多 j 个的所有方案的集合(即不同数量的左括号的方案数)

(2)属性:数量

状态计算:

#python3
MOD = (int)(1e9 + 7)def add(x, y):  return (x + y) % MODdef brackets():f = [[0 for i in range(n + 10)] for i in range(n + 10)]  f[0][0] = 1for i in range(1, n + 1):if str[i] == '(':for j in range(1, n + 1):f[i][j] = f[i - 1][j - 1]else:f[i][0] = add(f[i - 1][0], f[i - 1][1])for j in range(1, n + 1):f[i][j] = add(f[i - 1][j + 1], f[i][j - 1])for i in range(n + 1):if f[n][i]:return f[n][i]str = list(input())
n = len(str)str.insert(0, 0)  //使目标字符串下标从 1 开始
ans_l = brackets()str.reverse()
for i in range(n):if str[i] == '(':str[i] = ')'else:str[i] = '('
str.insert(0, 0)  //使目标字符串下标从 1 开始
ans_r = brackets()print(ans_l * ans_r % MOD)

获取更多题解,算法讲解欢迎关注公众号:算法梦工厂
蓝桥杯备赛群:

【蓝桥杯真题】2021年蓝桥杯省赛A组题目解析+代码(python组)相关推荐

  1. 蓝桥杯 真题 2021 4、路径

    [题目] ​ 小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径. ​ 小蓝的图由2021 个结点组成,依次编号1 至2021. ​ 对于两个不同的结点a, b,如果a 和b ...

  2. #蓝桥杯真题【思特奇杯·云上蓝桥-算法集训营】第2周

    蓝桥杯训练营第二周作业 1.带分数 问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数 ...

  3. 【蓝桥杯真题】2020蓝桥杯真题-跑步锻炼

    本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 小蓝每天都锻炼身体.正常情况下,小蓝每天跑 1 千米.如果某天是周一或者月初(1 日),为了 ...

  4. 蓝桥杯python省赛冲刺篇2——常用算法的详细解析及对应蓝桥杯真题:打表模拟法、递推递归法、枚举法、贪心算法、差分与前缀和

    注意:加了题目链接 目录 注意:加了题目链接 一.打表模拟法 介绍 1. 算式问题 题目描述 解析与代码演示 2. 求值 题目描述 解析与代码演示 3. 既约分数 题目描述 解析与代码演示 4. 天干 ...

  5. 蓝桥杯真题2017-2021

    刷完近几年真题,感觉理解完之后,拿奖问题不大,本人这次获得2022年蓝桥杯javaB组省一,以下是历年javaB组省赛题目. 文章目录 2017年真题 一.购物单 二.纸牌三角形 三.承压计算 四.魔 ...

  6. python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在19351936年应邀来中国清华大学讲学。。。

    python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学... 问题描述 全排列模板: 美国数学家维纳(N. ...

  7. 第五届蓝桥杯真题解析【JavaC组】

    第五届蓝桥杯真题解析[JavaC组] 业精于勤,荒于嬉:行成于思,毁于随.--韩愈 文章目录 ***第五届蓝桥杯真题解析[JavaC组]*** 前言 A:猜年龄 B:等额本金 C:猜字母 D:大衍数列 ...

  8. 【蓝桥杯真题】16天冲刺 Python

    距离比赛很快了,希望和我一起准备的PY党能更加熟练的掌握Python! 1.距离和(模拟赛填空题) 问题描述: 两个字母之间的距离定义为它们在字母表中位置的距离.例如 A和 C 的距离为 2,L 和  ...

  9. 蓝桥杯真题:三羊献瑞

    蓝桥杯真题:三羊献瑞 观查下面的加法算式: 其中相同的汉字代表相同的数字,不同的汉字代表不同的数字. 请你填写"三羊献瑞"所代表的4位数字(答案唯一),不要填写任何多余内容. 分析 ...

最新文章

  1. 慎用Outline ,UGUI Outline实现原理分析
  2. seq2seq模型_Bart: Seq2Seq预训练模型
  3. 缓冲区溢出基本C程序的控制台和Win32版本
  4. json 反射java 实体_Java 将JSON反射到实体类
  5. 关于优酷开放SDK之setOnLoadingStatusListener
  6. 存档丢失以后再补之R语言与logistic模型
  7. 《 自动化测试最佳实践:来自全球的经典自动化测试案例解析》一一1.3 建立自动化策略...
  8. remix卡在android root,小米平板刷入remixeOS后怎么root?
  9. sqlachemy入门基础手册
  10. 《WinForm开发系列之控件篇》Item31 MenuStrip(暂无)
  11. 神经网络拟合高程异常
  12. Java 8实战-Stream 查找替换 VS 归约reduce
  13. 关于安卓(apk)unity3d游戏汉化简单做一些全面分析
  14. Excel_使用条件格式制作甘特图
  15. SpringMvc接收请求
  16. 软件测试架构师——众里寻她千百度
  17. 吉林大学计算机学院2002级,吉林大学计算机科学与技术学院导师简介:卢奕南...
  18. 机器学习三大基本任务_Task01
  19. 小程序广告主和流量主相关
  20. Qt下QTableWidget 基本用法

热门文章

  1. 嘀嗒陪诊v1.1.1 陪护 养老服务 家政
  2. toad mysql导入excel_toad导入表数据库
  3. Py之toad:toad的简介、安装、使用方法之详细攻略
  4. 计算机重装系统的作用,经常重装系统对电脑有影响吗?听听专家怎么说!
  5. 以太网交换机EtherSwitch
  6. 【 Visual C++】游戏开发笔记之二——最简单的DirectX,vc窗口的编写
  7. 南通蓝领技工学校计算机咋样,南通市蓝领技工学校
  8. 2019全国电赛总结
  9. A. Alternative Architecture
  10. Powerpoint发现中的内容有问题,Powerpoint 可尝试修复此演示文稿。