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)
相关推荐
Dxy12393102162 小时前
Python PDFplumber详解:从入门到精通的PDF处理指南
开发语言·python·pdf
在努力的韩小豪4 小时前
如何从0开始构建自己的第一个AI应用?(Prompt工程、Agent自定义、Tuning)
人工智能·python·llm·prompt·agent·ai应用·mcp
Otaku love travel5 小时前
实施运维文档
运维·windows·python
测试老哥6 小时前
软件测试之单元测试
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
presenttttt6 小时前
用Python和OpenCV从零搭建一个完整的双目视觉系统(六 最终篇)
开发语言·python·opencv·计算机视觉
测试19987 小时前
软件测试之压力测试总结
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·压力测试
李昊哲小课8 小时前
销售数据可视化分析项目
python·信息可视化·数据分析·matplotlib·数据可视化·seaborn
烛阴8 小时前
带参数的Python装饰器原来这么简单,5分钟彻底掌握!
前端·python
全干engineer8 小时前
Flask 入门教程:用 Python 快速搭建你的第一个 Web 应用
后端·python·flask·web
nightunderblackcat8 小时前
新手向:Python网络编程,搭建简易HTTP服务器
网络·python·http