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 小时前
基于卷积神经网络和Pyqt5的猫狗识别小程序
人工智能·python·神经网络·qt·小程序·cnn
lllsure3 小时前
Python基础语法
开发语言·python
winfredzhang4 小时前
使用Python 打造多格式文件预览工具 — 图、PDF、Word、Excel 一站式查看
python·pdf·word·excel·照片·查看,zip,复制
浩皓素4 小时前
Python连接云端服务器:基于Paramiko库的实践与问题剖析
python
致于数据科学家的小陈4 小时前
Go 层级菜单树转 json 处理
python·go·json·菜单树·菜单权限·children
伊织code4 小时前
MixTeX - 支持CPU推理的多模态LaTeX OCR
python·ai·ocr·latex·mixtex
jardonwang15 小时前
DeepInjectSQL - 基于 AI 生成对抗网络(GAN)的下一代 SQL 注入自动化漏洞猎手
python·测试工具·生成对抗网络·安全性测试
大G哥5 小时前
加速LLM大模型推理,KV缓存技术详解与PyTorch实现
人工智能·pytorch·python·深度学习·缓存
Python×CATIA工业智造5 小时前
深入解析多线程与多进程:从理论到Python实践
python·pycharm
qq_263_tohua5 小时前
第99期 dropout防止过拟合
pytorch·python·深度学习