2025第十六届蓝桥杯PythonB组部分题解

一、攻击次数

题目描述

小蓝操控三个英雄攻击敌人,敌人初始血量2025:

  • 第一个英雄每回合固定攻击5点
  • 第二个英雄奇数回合攻击15点,偶数回合攻击2点
  • 第三个英雄根据回合数除以3的余数攻击:余1攻2点,余2攻10点,余0攻7点

游戏从第1回合开始,当敌人血量≤0时结束,求结束时的回合数。

解题思路

模拟战斗过程:

  1. 每个回合依次计算三个英雄的攻击总和
  2. 更新敌人血量并检查是否≤0
  3. 注意回合数需减1(回合从1开始计数)

代码实现

python 复制代码
r = 2025
k = 1
while r > 0:
    r -= 5
    if k % 2 == 1:
        r -= 15
    else:
        r -= 2
    if k % 3 == 1:
        r -= 2
    elif k % 3 == 2:
        r -= 10
    else:
        r -= 7
    k += 1
print(k - 1)

二、最长字符串

题目描述

从单词本中找出最长优美字符串:

  • 长度为1时本身是优美字符串
  • 长度>1时,存在前n-1个字符重组后的优美字符串
  • 多个解时取字典序最小

解题思路

  1. 对单词去重并按长度、字典序排序
  2. 维护优美字符串集合
  3. 动态验证并更新最长结果

代码实现

python 复制代码
s = '''bbccbddbca'''
s = s.split('\n')
g = sorted(set(s), key=lambda x: (len(x), x))
v = set()
ans = ''
mx = -1
dd = []
for x in g:
    m = len(x)
    if m == 1:
        v.add(x)
        ans = x
        mx = 1
        dd.append(x)
    else:
        t = ''.join(sorted(x[:-1]))
        if t in v:
            dd.append(x)
            if m >= mx:
                mx = m
                ans = min([ans, x]) if m == mx else x
            v.add(''.join(sorted(x)))
dd = sorted(set(dd), key=lambda x: (-len(x), x))
print(ans)

三、LQ图形

题目描述

用字符Q绘制L型图案:

  • 竖笔划宽度w,高度h
  • 横笔划宽度v+w

解题思路

分两部分构建:

  1. 竖部:h行,每行w个Q
  2. 横部:w行,每行(v+w)个Q

代码实现

python 复制代码
w, h, v = map(int, input().split())
ans = []
for _ in range(h):
    ans.append(['Q']*w)
for _ in range(w):
    ans.append(['Q']*(v+w))
for row in ans:
    print(''.join(row))

四、最多次数

题目描述

从给定字符串s中切割最多数量的指定3字符组合(6种可能)。

解题思路

贪心策略:

  1. 滑动窗口遍历字符串
  2. 遇到有效组合立即标记使用
  3. 跳过已使用字符

代码实现

python 复制代码
s = input()
n = len(s)
v = [False]*n
d = {'lqb','lbq','qlb','qbl','blq','bql'}
ans = 0
for i in range(2, n):
    if not v[i-2] and not v[i-1] and s[i-2:i+1] in d:
        ans += 1
        v[i-2:i+1] = [True]*3
print(ans)

五、A * B Problem

题目描述

计算满足X_AX_B + Y_AY_B ≤ L的正整数组合数。

解题思路

  1. 预处理乘积频次
  2. 使用前缀和优化查询
  3. 数学优化枚举过程

代码实现

python 复制代码
def f2(l):
    from math import isqrt
    v = [0]*(l+1)
    for i in range(1, l+1):
        for j in range(i, l//i +1):
            if i*j <= l:
                v[i*j] += 2 - (i==j)
    p = [0]*(l+1)
    for i in range(1, l+1):
        p[i] = p[i-1] + v[i]
    return sum(v[i] * p[l-i] for i in range(1, l+1))
print(f2(int(input())))

六、园艺

题目描述

保留最长的等间隔递增树列。

解题思路

动态规划:

  • dp[i][d]表示以i结尾、间隔d的最长序列
  • 枚举前驱树更新状态

代码实现

python 复制代码
n = int(input())
a = list(map(int, input().split()))
dp = [[1]*(n+1) for _ in range(n)]
for i in range(n):
    for j in range(i):
        if a[i]>a[j] and (d:=i-j):
            dp[i][d] = max(dp[i][d], dp[j][d]+1)
print(max(max(row) for row in dp))

七、书架还原

题目描述

通过交换操作将乱序书恢复顺序,求最少操作次数。

解题思路

环分解:

  • 每个环需要(环长-1)次操作
  • 总次数=Σ(环长-1)

代码实现

python 复制代码
n = int(input())
a = list(map(int, input().split()))
vis = [False]*n
ans = 0
for i in range(n):
    if not vis[i] and a[i]!=i+1:
        cnt = 0
        j = i
        while not vis[j]:
            vis[j] = True
            j = a[j]-1
            cnt += 1
        ans += cnt-1
print(ans)

八、异或和

题目描述

计算ΣΣ(a_i⊕a_j)*(j-i)的值。

解题思路

按位统计贡献:

  • 维护每位0/1的出现位置和
  • 计算每位对最终结果的贡献

代码实现

python 复制代码
n = int(input())
a = list(map(int, input().split()))
ans = 0
for bit in range(20):
    cnt0 = cnt1 = sum0 = sum1 = 0
    for i in range(n):
        if (a[i] >> bit) & 1:
            ans += (cnt0*i - sum0) * (1<<bit)
            cnt1 += 1
            sum1 += i
        else:
            ans += (cnt1*i - sum1) * (1<<bit)
            cnt0 += 1
            sum0 += i
print(ans)
相关推荐
大模型铲屎官1 分钟前
【深度学习-Day 31】CNN基石:彻底搞懂卷积层 (Convolutional Layer) 的工作原理
人工智能·pytorch·python·深度学习·机器学习·cnn·llm
struggle20251 小时前
DeepForest开源程序是用于 Airborne RGB 机器学习的 Python 软件包
开发语言·python
杜大哥1 小时前
Python:.py文件如何变成双击可执行的windows程序?(版本1)
开发语言·windows·python
四川兔兔2 小时前
Pytorch 实战四 VGG 网络训练
人工智能·pytorch·python·深度学习·机器学习·回归·vgg网络
猫头虎2 小时前
2025最新Python 100个常用函数在线体验项目
android·java·python·pycharm·django·pandas·pip
微信公众号:AI创造财富2 小时前
构建 docket uable to prepar context: path “.“ not found
python·plotly·flask·pillow·ipython·tornado
烛阴2 小时前
Python多进程开发实战:轻松突破GIL瓶颈
前端·python
Sim time2 小时前
用AI从0开始量化交易-Anaconda环境(env)和缓存(pkg)更改储存位置
人工智能·python·conda
struggle20253 小时前
torchmd-net开源程序是训练神经网络潜力
c++·人工智能·python·深度学习·神经网络
软件开发技术深度爱好者3 小时前
python中学物理实验模拟:凸透镜成像和凹透镜成像
开发语言·python