第十三届蓝桥杯大赛真题PythonB组详解 内含周末献血日记

前言

今天上午去献血啦!在成都市血液中心,待遇很好,体检通过后先发了一些食物,防止一会饿或者来之前空腹的童鞋。可以看出吃的还是比较不错的,正常的早饭也不会吃那么多,但是泡面的油包不能放,水是甜的加了糖之类的,面包不太好吃,就是纯面包,吃不了可以带着,后面才知道没吃饱也可以再加,嘻嘻。
在这里插入图片描述
体检的时候会给免费测一次血常规,里面参数大家就找个对照表比对一下吧,有没有专业人士帮我看下我的学业状况(#.#),我献的是血小板,据说三天内可以恢复到之前状态,并在14天内不能继续献血。
在这里插入图片描述
好了扯了这么多,回到正题,距离今年省赛还有5天,我作为一个普通学生,选择继续刷真题,同时也希望大家相互帮助,相互学习,合作共赢嘛!

A:卡片

在这里插入图片描述
首先我们思考一下,那个数字消耗的最快,从1开始,当然1最快耗光,所以我们只要在每个数字中查找1的数量,累计起来当达到2022时break

num=0
for i in range(1,10000):
  num+=str(i).count("1")
  if num>2021:
    break
print(i-1)//当前数字未能完全拼出,所以i-1

B:直线

在这里插入图片描述
这题还是比较简单,要我们求这些点一共能组成多少种直线,就是不同斜率和截距,我们可以把这两个参数变成一个元素,用set存储起来不会重复,最后集合的长度就是解。

points=[[x,y] for x in range(20) for y in range(21)]//先建表
arr=set()
for i in points:
  x1,y1=i[0],i[1]
  for j in points:
    x2,y2=j[0],j[1]
    if x1==x2://横坐标相同就是垂直,没有斜率后面加
      continue
    k=(y2-y1)/(x2-x1)
    b=(x2*y1-x1*y2)/(x2-x1)
    if (k,b) not in arr://不在就加进去
      arr.add((k,b))
print(len(arr)+20)

C:货物摆放

在这里插入图片描述
这题主打一个找因子,n%两个因子的乘积==0,就说明符合条件,可以用1凑第三个数嘛,注意读题,不是要求必须正方形,n=L * W * H

n=2021041820210418
l=[]
i=2
x=n
while i<pow(x+1,0.5)://求因数
  if x%i==0:
    l.append(i)
    x//=i
  else:
    i+=1
l.append(x)
s=set()
s.add(1)
for j in l:
  p=set()
  for k in s:
    p.add(j*k)//求因子,最小是1*2=2
  for k in p:
    s.add(k)
count=0
for k1 in s:
  for k2 in s:
    if n%(k1*k2)==0:
      count+=1
print(count)

D:路径

在这里插入图片描述


E:回路计数

在这里插入图片描述
这到题我看网上用二进制计算到达与否关系的方法较多,一开始看的很晕,我尝试解释一下,如果哪里有问题欢迎大家comment。
topic:从1号教学楼开始,访问完每一栋教学楼一次,又回到一号教学楼的不同方案
1.状态压缩+DP
每一栋教学楼分为访问和不访问,可以用0,1表示,访问完所有的教学楼就用21个1表示。
2.动态规划:划分子问题
原问题:访问玩每栋教学楼又回到一号楼的不同方案,所有的楼都可以回到1号教学楼,因为1和所有都互质,最后一次可以在2-21号楼,在这基础上,再次划分子问题,如果最后一次访问的是2号楼,它可以由上一次所在的教学楼方案数之和得到
3.状态转移方程
dp[ i + (1 << k) ][ k ] += dp[ i ][ j ];
k一定要在状态i中,并且k和j要有通路,j是最后访问的,dp[ i ][ j ]表示从状态 i 到 j 的路径数,原状态 i 在楼 j 已经访问过的情况下,尝试将楼 k 加入已访问的点。说白了就是去回溯j的上一层都有啥。
4.初始状态
dp[1][0] = 1,只访问1号楼,且当前所在教学楼为1的方案,只有一种。

import math
n=21
state=1<<21
Map=[[0]*(n+1) for i in range(n+1)]
dp=[[0]*n for i in range(state)]
dp[1][0]=1
for i in range(n+1):
  for j in range(n+1):
    if math.gcd(i,j)==1:
      Map[i][j]=1
for i in range(state):
  for j in range(n)://当前是第几栋楼
    if i>>j&1://这栋楼来没来过
      for k in range(n)://来过就判断这栋和它上一层的关系
        if Map[k+1][j+1]==1 and i>>k&1://有通路并且有路来
          dp[i][j]+=dp[i-(1<<j)][k]//累加起来
print(sum(dp[-1])-dp[-1][0])

F:时间显示

在这里插入图片描述
回去把datetime库玩两遍,送分题可不能丢,因为他输入的是一个毫秒数,所以用delta把单位换一下,delta更像是一个增量单位,他输入的是微秒数乘以微秒单位就是一个时间段。

from datetime import datetime, timedelta
start = datetime(year=1970, month=1, day=1)
dela = timedelta(milliseconds=1)
now = int(input())
now = start + now * dela
print('%02d:%02d:%02d' % (now.hour, now.minute, now.second))

G:杨辉三角形

在这里插入图片描述
大名鼎鼎的杨辉三角来啦!这道题可以写程序也可以找规律,当然前提是有点奥数基础。
想了半天,自己理解的还是不太好,这里就不贴代码了,大家自己搜索一下资料吧。

H:左孩子右兄弟

在这里插入图片描述
在这里插入图片描述
这题要求数层数,我们可以用DP的方法,记住当前层个数,和孩子节点中层数最多的。
因为我们考虑的是最大层数,根节点是0层,他的孩子可以全部算上,然后求一个孩子节点中层数最多的方法,就是答案。

import sys
sys.setrecursionlimit(100000)         #设置最大递归深度
n = int(input())
A = [[] for i in range(n + 1)]        #根是从索引1开始,所以索引0就不用了,开n加1个位置

#构建二叉树存储输入的值
for i in range(2, n + 1):
    v = int(input())                  #先接收位置,相同层的放在一起
    A[v].append(i)                    #把节点加到输入的那一层中去

#深度优先搜索与动态规划
def dfs(i):
    if A[i] is None:                  #叶子节点,高度为0
        return 0

    maxn = 0                     
    for j in A[i]:                    #以i为父节点的所有子节点的二叉树的高度最大值
        maxn = max(maxn, dfs(j))      #以i为节点形成的所有二叉树的高度最大值

    return len(A[i]) + maxn           #孩子节点的个数 + 以孩子节点为根节点构成二叉树的高度最大值

print(dfs(1))          	              #以1作为根节点二叉树的最高的高度

最后两道题我之前的博客里面写过,这里就不仔细说了。

结语

这届真题总的来看难度还是适中的,5道填空题好评,就是数字有点大,编程题的前3道需要仔细读题思考,多测试,多手敲,少看题解代码,最后3天截断代码依赖,自己手敲两套练练。
最后也给献血旅程做个总结,我献的一个测试量(最多两个),耗时52分钟,加上前面体测、吃东西,以及器材安装和拆卸,可以说时间还是蛮久的,痛感嘛就还好,运行的时候是没什么感觉的,躺在那里休息就好,五十分钟也够刷一集剧了。
在这里插入图片描述
有趣的是当我在那躺着,血液中心的一个领导样貌的工作人员还给我送了一个赠品(笔记本),because I’m student,送我!
拆卸之后就出去领献血证以及献后食物,我建议大家一边吃一边排献血证,后面人有点多,而且这种地方的机器反应你懂得。。
当然啦吃的还不错,食物是新鲜的,这也是个缓冲区,防止没有位置献血。
在这里插入图片描述
最后贴一个献血前后注意事项吧,我只能说大家量力而行,一个测试量有150元的补助,但是花费的时间还是很久的,从学校坐车来和回去一共花了5小时,到家后浑身腰酸背痛,睡眠质量都提升了,这次的blog就到这里吧,离蓝桥杯还有4天,大家放松心态,记得提前打印准考证,刷刷真题和模板,我们赛后再见!
在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 第十三届蓝桥杯大赛青少组国赛python是一个关于电梯的问目要求我们模拟一个电梯系统,根据乘客的请求,确定电梯的运行状态和楼层,最终输出总运行时间。 首先,我先定义了一个电梯类,其中包括电梯的当前楼层、运行状态、总运行时间等属性,并且编写了相应的初始化函数进行初始设置。 然后,我利用一个列表来表示乘客的请求列表,列表中每个元素都是一个元组,包括请求的楼层和请求时间。通过遍历这个列表,我判断当前请求是否在电梯运行的楼层范围内。如果是,则不需要改变电梯的运行状态,只需要更新电梯的总运行时间。如果不是,则根据请求的楼层和电梯当前的楼层确定运行的方向,并且更新电梯的总运行时间。 最后,我输出了电梯的总运行时间。 这道的难点在于正确判断电梯的运行状态和方向,并且根据不同情况进行相应的操作。我通过分析目要求和思考,设计了合理的算法和逻辑,最终成功解决了问。 通过这道,我巩固了对Python语言的掌握,并且提高了编程和逻辑思维能力。这个比赛对于提高编程水平和培养创新能力来说是非常有益的,我会继续参加类似的比赛,不断提升自己。 ### 回答2: 第十三届蓝桥杯大赛青少组国赛Python主要包括以下几个问: 1. 判断一个数是否为素数。 在这个问中,可以使用一个循环从2开始到该数的平方根,判断是否存在能够整除该数的因子。如果不存在,则该数为素数。 2. 模拟游戏角色的移动。 这个问可以通过设定一个坐标系,然后记录游戏角色的位置和移动方向。根据给定的指令,改变角色的位置。可以使用单个变量来表示角色的位置,并根据不同的指令来更新角色的位置。 3. 求解整数序列的最大连续和。 在这个问中,可以使用动态规划的思想来解决,设置一个变量max_sum表示当前的最大连续和,另一个变量tmp_sum表示当前子序列的和。遍历整个序列,如果tmp_sum加上当前元素大于0,则更新tmp_sum,并比较tmp_sum和max_sum的大小。 4. 判断一个IP地址是否合法。 IP地址由四个整数组成,每个整数范围在0-255之间,且由点分隔。可以使用正则表达式来匹配IP地址的格式,并使用条件判断来判断每个整数是否在正确的范围内。 以上是对第十三届蓝桥杯大赛青少组国赛Python的简要回答。具体的解过程需要根据每个具体问的要求和限制条件来进行分析和解答。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Chowley

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

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

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

打赏作者

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

抵扣说明:

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

余额充值