【第十二届 蓝桥杯省赛B组】试题解析

本文详细介绍了多个IT技术领域的实例,包括模拟二分查找、枚举法在直线和货物摆放中的应用、动态规划求解路径和回路计数,以及树形数据结构、单位转换和数学问题如杨辉三角的处理。
摘要由CSDN通过智能技术生成

一、卡片。

1. 难度系数:⭐

2. 知识点: 模拟 二分查找 组合数

3. 要点分析:无

import os
import sys
import math

# 输入数据
n = int(input())

count = 0
k = 0
while n>count:
    k += 1
    count += k
print(k)

二、直线。

1. 难度系数:⭐⭐⭐

2. 知识点: 枚举

3. 要点分析

①构建直线的二元组(k,b),存入容器中,最终计算容器内的元素个数即可。

set 的常用函数汇总:

1)new Set(iterable):创建set,可以传入可迭代的对象,一般是数组
2)set.add(value):添加值到set中,返回set本身
3)set.delete(value):删除值,值存在返回true,否则返回false
4)set.has(value):判断value是否在set中,在返回true,否则返回false
5)set.clear():清空set
6)set.size:返回集合个数,类似length

②斜率不存在的直线也算直线,额外计算。

import sys

# 创建二维列表:代表xy坐标系
points=[[x,y] for x in range(20) for y in range(21)] 
# 创建集合属性的容器
docker=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 docker: #存入容器里没有的(斜率,截距)对
          docker.add((k,b))
print(len(docker)+20)                   

 三、货物摆放。

1.难度系数:⭐⭐⭐

2. 知识点:枚举

3. 要点分析

①找出所有的正因子。

n = 2021041820210418
lst = []
for i in range(1,int(n**0.5)+1):
    if (n % i == 0):
        lst.append(i)
        if n / i != i:
            lst.append(n//i)
print(lst)

 ②暴力求解。

import sys
import os

ans = 0
n = 2021041820210418
lst = []
for i in range(1,int(n**0.5)+1):
    if (n % i == 0):
        lst.append(i)
        if n / i != i:
            lst.append(n//i)

docker = set()
for i in lst:
    for j in lst:
        x = n//i//j
        if n%(i*j)==0:
            if (i,j,x) not in docker and x in lst:
                docker.add((i,j,x))
print(len(docker))

 四、路径。

1.难度系数:⭐⭐⭐⭐

2. 知识点:图论 动态规划 LCM 最短路径

3. 要点分析

①求解最小公倍数。

②动态规划,得到全局最优解。

import sys
import math

#求最小公倍数
def gbs(a,b):  
  return a*b//(math.gcd(a,b))

n = 2021
length = 0
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 > 2021:
      break
    dp[j] = min(dp[j],dp[i]+gbs(i,j))
# 输出末尾值
print(dp[-1])

 五、回路计数。

1.难度系数:⭐⭐⭐⭐⭐

2. 知识点:动态规划 状压DP

3. 要点分析

 

六、时间显示。

1. 难度系数:⭐⭐⭐

2. 知识点: 单位换算

3. 要点分析:无。

import os
import sys
import math

# 输入数据
num = int(input())

# 计算有多少小时
oneHour = 60*60*1000
hour = (num // oneHour) % 24

# 计算有多少分钟
oneMinute = 60 * 1000
leftTime = num - hour * oneHour
minute = (leftTime // oneMinute) % 60

# 计算有多少秒
oneSecond = 1000
leftTime = num - minute * oneHour
second = (leftTime // oneSecond) % 60

# 输出具体时间
print("{:02d}:{:02d}:{:02d}".format(hour, minute, second))

七、杨辉三角形。

1. 难度系数:⭐⭐⭐⭐

2. 知识点:规律 思维 二分

3. 要点分析

①“杨辉三角形”对称,只需看左半边;每行最大的数为 C(n, n // 2),当n取33时有C(n, n // 2) > 1000000000,因此只需考虑0到33行。

②逐行搜索,该数第一次出现的位置,即为当前行最大的数。

③用“二分法”进行查找,查找速度会得到有效提升。

import sys
import os

# 计算二项式
def C(n, m):
  up = 1; down = 1
  t = n
  for i in range(1, min(m, n - m) + 1):
    up *= t; t -= 1
    down *= i
  return up // down

# 二分查找
def search(i):
  l = i 
  r = max(n, l) 
  k = i // 2
  while l < r:
    mid = (l+r) >>1
    if C(mid, k) < n: 
        l = mid + 1
    else: 
        r = mid
  return l

n = int(input())
for i in range(34,-1,-2):
    # 逐行搜索
    t = search(i)
    if C(t, i // 2) == n:
        print(t * (t + 1) // 2 + i // 2 + 1)
        break

八、左孩子右兄弟。

1. 难度系数:⭐⭐⭐⭐

2. 知识点:树形DP 动态规划

3. 要点分析

①“函数递归调用”会将大量的上下文信息入栈,如果递归深度过大,会导致线程栈空间不足而崩溃;在Python中,为了防止栈崩溃,默认递归深度是有限的。因此,我们需要自行设置最大的递归深度

②了解“孩子兄弟表示法”

③本质上是利用“递归”,求解树的深度。

递推公式:最深深度=子结点个数+子结点的最深深度

import os
import sys

# 设置最大递归深度
sys.setrecursionlimit(100000)

# 输入数据
n = int(input())

# 存储多叉树中每一层的节点数据
node = [[] for _ in range(n+1)]
for i in range(2, n+1):
    v = int(input())
    node[v].append(i)

# 根节点里子节点的最深高度
def search(index):
    # 叶子节点
    if node[index] is None:
        return 0
    
    maxn = 0
    for x in node[index]:
        maxn = max(maxn, search(x))
    
    return len(node[index]) + maxn

print(search(1))

九、异或数列。

1. 难度系数

2. 知识点:

3. 要点分析

十、括号序列。

1. 难度系数

2. 知识点:

3. 要点分析

 

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值