2025第十六届蓝桥杯python B组满分题解(详细)

news2025/4/23 23:39:06

目录

前言

A:  攻击次数

 解题思路:

代码:

B:  最长字符串

解题思路:

代码:

C:  LQ图形

解题思路:

代码:

D:  最多次数

 解题思路:

代码:

 E:  A * B Problem

解题思路:

代码:

F:  园艺

​编辑

解题思路:

代码:

G:书架还原

解题思路: 

代码:

H:  异或和

解题思路:

代码:

结论:


前言

此次蓝桥杯共8道题(2道填空,6道编程)满分100。与去年的题相比难度降低了不少,第一道编程题简直送分,刚学的小白估计也会。我本人大一,刚学python不久,我只能说这次比赛中基本没用到什么算法,全是暴力,考前学习的DFS,BFS,二维前缀差分等等都没用上,虽然比赛中有的题我暴力也没做出来。当然,这套题想拿高分也不容易,面对巨大数据量,时间复杂度是个问题。

下面给大家分享一下满分题解,是我赛后重做,又综合各个大佬的题解做出的。以下代码在洛谷均可通过,现在蓝桥官网上还没更新,不知在蓝桥官网上测评如果。欢迎各位大佬对我的题解进行点评指正。

A:  攻击次数

 解题思路:

这道题没什么难度,正确结果为103,我估计会有不少人结果为104,原因为如果设回合数i的初始值为1,这里需要注意的是在103回合后,血量已经小于0,但在下个while循环中,回合数仍+1,所以最后结果要-1。所以直接设i为0即可。

代码:

n=2025
i=0
while n>0:
    atk = 5
    if i%2==1:
        atk+=15
    else:
        atk+=2
    if i%3==1:
        atk+=2
    if i%3==2:
        atk+=10
    if i%3==0:
        atk+=7
    n-=atk
    i+=1
print(i)

B:  最长字符串

 这道题有难度,比赛时没啥思路,50000个数据当时让电脑死机两回

解题思路:

正确答案为'afplcu'。想做对当然要先完全理解题目的啦。这里难点在于若s4是优美字符串,那么s3,s2,s1都必须是优美字符串。什么是字典序最小?简单来说就是如果相同长度,其字母在字母表中排位越靠前,字典序越小。例如 'abc'<'abd'。

  • 为了方便遍历,要将50000个数据转换化成列表形式
  • 先对列表按照长度排序,短的放在前面,因为长字符串是否符合需要短字符串进行辅助
  • 建立一个seen集合,从短到长存储长度为1的字符串与不同长度的优美字符串
  • 利用sorted()可将乱序字符串按字典序改成统一的顺序进行判断
  • 利用for循环,从短到长依次判断。(txt文档可在博客顶部下载)

代码:

l=        # 将txt中的所有数据复制到三引号内即可,此处省略
'''
tdasm
ciswmz
.
.
.
'''
l=l.split('\n')
l=list(set(l))    # 删除重复数据
l.sort(key = len)
seen = set()
ret = ''

for i in l:
    if len(i) == 1:
        seen.add(i)
    else:
        ss = sorted(i[:-1])
        m=''.join(ss)
        if m in seen:
            ans = ''.join(sorted(i))
            seen.add(ans)
            if len(i) > len(ret):   # 长度最长
                ret = i
            elif i < ret:           # 字典序最小
                ret = i

print(ret)  #afplcu

C:  LQ图形

解题思路:

超级简单,两个for循环 

代码:

w,h,v=map(int,input().split())
for i in range(h):
    print('Q'*w)
for j in range(w):
    print('Q'*(v+w))

D:  最多次数

 解题思路:

  • 建立一个包含六种可能的列表
  • 利用while循环切片,若在列表中计数加1

代码:

n=input()
num=0
i=0
seen1=['l','q','b']  
seen2=['lqb','lbq','qlb','qbl','blq','bql']

while i<=len(n)-3:
    if n[i] in seen1:   # 减少不必要的切片操作
        ans=n[i:i+3]
        if ans in seen2:
            num+=1
            i+=3
        else:
            i+=1
    else:
        i+=1
print(num)

 E:  A * B Problem

有点难度,比赛时没啥思路,纯暴力的话应该可以通过40%--80%的数据,但要想全通过就要用到数论中约数个数与约数个数前缀和之间的计数关系。如果有更好的办法,欢迎评论留言。

解题思路:

  • 建立列表a,计算1--L 每一个数的约数个数
  • 建立列表b,计算约数个数的前缀和
  • 约数个数与约数个数前缀和乘积的累加

代码:

L=int(input())
ans=0
a=[0]*(L+1)
b=[0]*(L+1)

for i in range(1,L+1):
    for j in range(i,L+1,i):
        a[j]+=1          #约数个数计数器 +1

for i in range(1,L+1):
    b[i]=b[i-1]+a[i]     #前缀和数组

for i in range(1,L+1):
    ans+=a[i]*b[L-i]     #统计答案
print(ans)

F:  园艺

解题思路:

  • 这道题类似于求最长递增子序列,利用动态规划来做
  • 建立一个dp数组,用来记录每一个以第i棵为结尾,d为间隔的棵树数据
  • 遍历全部dp数组,找到最大值

代码:

n = int(input())
a = list(map(int, input().split()))
dp = [[1] * (n + 1) for i in range(n)]

for i in range(n):
    for j in range(i):
        if a[i] > a[j]:   # 满足高度递增
            d = i - j     # d为两树之间间隔
            dp[i][d] = max(dp[i][d], dp[j][d] + 1)

ans = 0
for row in dp:
    if max(row)>ans:   # 找最大值
        ans=max(row)   
print(ans)

G:书架还原

我第一反应是利用两个for循环,虽然思路是对的,但时间复杂度太高,但只通过了30%的数据

解题思路: 

  • 要想操作次数最少,必须每一次操作都至少有一本书归放原处
  • 从第一个为位置开始,定住一个位置,若此书理应不在此位置,进入while循环
  • 在循环中,将此位置的书放回原位置,而原位置的书拿过来,再次进行while判断

代码:

n = int(input())
nums = list(map(int, input().split()))
count = 0

for i in range(n):
    while i != nums[i] - 1:
        ans = nums[i]
        nums[i] = nums[ans - 1]     
        nums[ans - 1] = ans      # 书归原处
        count += 1
print(count)

H:  异或和

涉及到双重求和,求两个数的异或和可以用“ ^ ” 内置函数,比赛时忘了这个东西可以求异或和

利用for循环嵌套可以暴力通过40%的数据,这就是8分啊,比赛时能得到这8分也很不错了。

暴力代码:(只能通过40%数据,仅供参考)

n = int(input())
nums = list(map(int, input().split()))
ans = 0

for i in range(n):
    for j in range(i+1, n):
        x=j - i
        ans += (nums[i] ^ nums[j]) * x
print(ans)

如果要的满分要涉及到位运算,二进制每一位对最后结果的贡献。

解题思路:

  • 数据最大值的二进制有多少位,外循环就遍历多少次
  • 内循环从最小位开始,拿出每个数据二进制的第i位,只有当两个数一个为0一个为1时,才会对最后结果产生贡献,因为按位异或的原理为同为0,异为1。

代码:

n = int(input())
a = list(map(int, input().split()))
ans = 0
bit = 1   # 权重初始为1

s=bin(sorted(a)[-1])[2:]
for i in range(len(s)):
    dex0 = 0       # 当前位为0的下标和
    dex1 = 0       # 当前位为1的下标和
    count0 = 0     # 当前位为0的个数
    count1 = 0     # 当前位为1的个数

    for j in range(n):
        current = a[j]
        if (current >> i) & 1:  # 判断此位是否为1
            index=j + 1         # 下标值=索引值+1
            ans += bit * (index * count0 - dex0)  # 此位对最后结果的贡献
            dex1 += index
            count1 += 1
        else:
            index = j + 1
            ans += bit * (index * count1 - dex1)
            dex0 += index
            count0 += 1
    bit <<= 1      # 按位的权重*2
print(ans)

附:以题目所给[9,8,7,6]为例,计算第一次内循环的贡献为6。 ans=6+16+32+64=118

附:按位异或规则

结论:

总的来说,全用暴力也可以取得一个不错的成绩,想要高分还是有点难度的。本人是一个初学算法的大一小白,提供的代码和作图若有错误,欢迎各位大佬的点评指正,最后祝愿每一位参赛者都可以取得一个好成绩!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2341097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka 面试,java实战贴

面试问题列表 Kafka的ISR机制是什么&#xff1f;如何保证数据一致性&#xff1f; 如何实现Kafka的Exactly-Once语义&#xff1f; Kafka的Rebalance机制可能引发什么问题&#xff1f;如何优化&#xff1f; Kafka的Topic分区数如何合理设置&#xff1f; 如何设计Kafka的高可用跨…

linux多线(进)程编程——(9)信号量(一)

前言 在找到了共享内存存在的问题后&#xff0c;进程君父子着手开始解决这些问题。他们发明了一个新的神通——信号量。 信号量 信号量是一个计数器&#xff0c;用于管理对共享资源的访问权限。主要特点包括&#xff1a; &#xff08;1&#xff09;是一个非负整数 &#xff…

PFLM: Privacy-preserving federated learning with membership proof证明阅读

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

图片转base64 - 加菲工具 - 在线转换

图片转base64 - 加菲工具 先进入“加菲工具” 网 打开 https://www.orcc.top&#xff0c; 选择 “图片转base64”功能 选择需要转换的图片 复制 点击“复制”按钮&#xff0c;即可复制转换好的base64编码数据&#xff0c;可以直接用于img标签。

opencv 对图片的操作

对图片的操作 1.图片镜像旋转&#xff08;cv2.flip()&#xff09;2 图像的矫正 1.图片镜像旋转&#xff08;cv2.flip()&#xff09; 图像的旋转是围绕一个特定点进行的&#xff0c;而图像的镜像旋转则是围绕坐标轴进行的。图像的镜像旋转分为水平翻转、垂直翻转、水平垂直翻转…

LabVIEW数据采集与传感系统

开发了一个基于LabVIEW的智能数据采集系统&#xff0c;该系统主要通过单片机与LabVIEW软件协同工作&#xff0c;实现对多通道低频传感器信号的有效采集、处理与显示。系统的设计旨在提高数据采集的准确性和效率&#xff0c;适用于各种需要高精度和低成本解决方案的工业场合。 项…

【Easylive】​​Gateway模块 bootstrap.yml 解析

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 Gateway模块 bootstrap.yml 常规解析 该配置文件定义了 Spring Cloud Gateway 的核心配置&#xff0c;包括 环境配置、服务注册、动态路由规则 等。以下是逐项解析&#xff1a; 1. 基础配…

matlab 环形单层柱状图

matlab 环形单层柱状图 matlab 环形单层柱状图 matlab 环形单层柱状图 图片 图片 【图片来源粉丝】 我给他的思路是&#xff1a;直接使用风玫瑰图可以画出。 rose_bar 本次我的更新和这个有些不同&#xff01;是环形柱状图&#xff0c;可调节细节多&#xff1b; 只需要函数…

文献×汽车 | 基于 ANSYS 的多级抛物线板簧系统分析

板簧系统是用于减弱或吸收动态系统中发生的应力、应变、偏转和变形等破坏性因素的机械结构。板簧系统可能对外力产生不同的响应&#xff0c;具体取决于其几何结构和材料特性。板簧系统的计算机辅助分析对于高精度确定系统的变形特性和结构特性至关重要。 在这项工作中&#xff…

RHCE 练习二:通过 ssh 实现两台主机免密登录以及 nginx 服务通过多 IP 区分多网站

一、题目要求 1.配置ssh实现A&#xff0c;B主机互相免密登录 2.配置nginx服务&#xff0c;通过多ip区分多网站 二、实验 实验开始前需准备两台 linux 主机便于充当服务端以及客户端&#xff0c;两台主机 IP 如下图&#xff1a; 实验1&#xff1a;配置 ssh 实现 A&#xff0…

瑞吉外卖-分页功能开发中的两个问题

1.分页功能-前端页面展示显示500 原因&#xff1a;项目启动失败 解决&#xff1a;发现是Category实体类中&#xff0c;多定义了一个删除字段&#xff0c;但是我数据库里面没有is_deleted字段&#xff0c;导致查询数据库失败&#xff0c;所以会导致500错误。因为类是从网上其他帖…

工业物联网安全网关 —— 安全OTA升级签名验证

这里写目录标题 工业物联网安全网关 —— 安全OTA升级签名验证一、项目背景与简介1.1 背景介绍1.2 OTA升级的安全挑战1.3 项目目标二、理论基础与关键技术2.1 数字签名基础2.2 OTA升级签名验证原理2.3 关键技术与安全算法三、系统架构设计3.1 系统模块划分3.2 系统架构图(Merm…

探索 Flowable 后端表达式:简化流程自动化

什么是后端表达式&#xff1f; 在 Flowable 中&#xff0c;后端表达式是一种强大的工具&#xff0c;用于在流程、案例或决策表执行期间动态获取或设置变量。它还能实现自定义逻辑&#xff0c;或将复杂逻辑委托…… 后端表达式在 Flowable 的后端运行&#xff0c;无法访问前端…

HDFS入门】HDFS安全与权限管理解析:从认证到加密的完整指南

目录 引言 1 认证与授权机制 1.1 Kerberos认证集成 1.2 HDFS ACL细粒度控制 2 数据加密保护 2.1 传输层加密(SSL/TLS) 2.2 静态数据加密 3 审计与监控体系 3.1 操作审计流程 3.2 安全监控指标 4 权限模型详解 4.1 用户/组权限模型 4.2 umask配置原理 5 安全最佳实…

性能比拼: Go vs Java

本内容是对知名性能评测博主 Anton Putra Go (Golang) vs Java: Performance Benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中&#xff0c;我们将比较 Go 和 Java。 我们将基于 Golang 的 Fiber 框架和 Java 的 Spring Boot 创建几个简单的应用…

ElMessageBox消息弹框(vue3总结)

一 展示各种内容 const checkCheckbox (check: any, formEl: any) > {ElMessageBox({title: "服务协议及隐私权政策",message: h("p", null, [h("span", null, "我已阅读并同意 "),h("span",{style: "color: #477F…

Jupyter Notebook 中切换/使用 conda 虚拟环境的方式(解决jupyter notebook 环境默认在base下面的问题)

使用 nb_conda_kernels 添加所有环境 一键添加所有 conda 环境 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda in…

Tailwind CSS 开发入门:掌握基础语法要点

在前端开发中&#xff0c;Tailwind CSS 以原子化设计和实用类系统&#xff0c;构建精美页面的得力工具&#xff0c;摒弃传统 CSS 繁琐写法。掌握其基础语法是熟练运用它的关键&#xff0c;下面将详细介绍核心基础语法。 一、核心基础语法 1. 颜色类 Tailwind CSS 提供了丰富…

Java八股 深入理解Spring的AOP 面向切面编程 底层 保姆级教程 手写例子

目录 概念 AOP 术语 1. 连接点&#xff08;Jointpoint&#xff09;&#xff1a; 2. 切入点&#xff08;Pointcut&#xff09;&#xff1a; 3. 通知&#xff08;Advice&#xff09;&#xff1a; 4. 方面/切面&#xff08;Aspect&#xff09;&#xff1a; 5. 引入&#xff…

C++std::map

1. 概述​​ ​​定义​​&#xff1a;std::map 是C标准模板库&#xff08;STL&#xff09;中的关联容器&#xff0c;以键值对&#xff08;key-value pairs&#xff09;形式存储元素&#xff0c;支持快速查找和有序访问。 ​​- 头文件​​&#xff1a;#include ​​底层实现​…