第十六届蓝桥杯大赛软件赛省赛 Python 大学 B 组 满分题解

news2025/5/10 22:50:03

题面链接Htlang/2025lqb_python_b

个人觉得今年这套题整体比往年要简单许多,但是G题想简单了出大问题,预估5+0+10+10+15+12+0+8=60,道阻且长,再接再厉

代码仅供学习参考,满分为赛后洛谷中的测评,蓝桥杯官方测评待完成

A: 攻击次数

答案:103?181?题目没说明白每回合是不是只能使用一个英雄?

def I():
    return input()


def II():
    return int(input())


def MII():
    return map(int, I().split())


def LMII():
    return list(MII())


def solve():
    xl = 2025
    cnt = 0
    for i in range(1, 2025):
        cnt += 1
        xl -= 5
        if i % 2 == 1:
            xl -= 15
        else:
            xl -= 2
        if i % 3 == 1:
            xl -= 2
        elif i % 3 == 2:
            xl -= 10
        elif i % 3 == 0:
            xl -= 7
        if xl <= 0:
            break
        print(i, xl)
    print(cnt)


T = 1
for i in range(T):
    solve()

B: 最长字符串

答案:afplcu

# # 考场错误解
# def I():
#     return input()


# def II():
#     return int(input())


# def MII():
#     return map(int, I().split())


# def LMII():
#     return list(MII())

# def solve():
#     with open(r'words.txt', 'r') as file:
#         data = file.readlines()

#     dic = {}
#     for i in range(len(data)):
#         x = data[i].strip()
#         data[i] = list(x)
#         dic[x] = 0
#         data[i].sort()
#         dic[x] = data[i]

#     can = set()
#     for i in range(100):
#         for x in data:
#             if len(x) == i + 1:
#                 if len(x) == 1:
#                     can.add(tuple(x))
#                 else:
#                     if tuple(x[:len(x) - 1]) in can:
#                         can.add(tuple(x))
#     cnt = 0
#     for x in can:
#         if len(x) > cnt:
#             cnt = len(x)
#     res = []
#     for x in can:
#         if len(x) == cnt:
#             res.append(x)
#     # print(dic)
#     print(res)
#     for x in dic:
#         # print(tuple(dic[x]))
#         if tuple(dic[x]) == res[0]:
#             print(x)

    
# T = 1
# for i in range(T):
#     solve()

# 正解
def is_beautiful_words(words):
    """
    计算所有优美单词,并返回一个字典:
    key: 单词长度
    value: 集合,每个元素为 (word, sorted(word)) 表示已经确认的优美单词
    """
    # 按长度升序排序(长度相同时字典序排序)
    words_sorted = sorted(words, key=lambda w: (len(w), w))
    
    # 用于存储每个长度的优美单词
    beautiful_by_length = {}
    
    for word in words_sorted:
        l = len(word)
        if l == 1:
            # 长度为1的单词自动是优美字符串(只要在单词本中)
            beautiful_by_length.setdefault(1, set()).add( (word, word) )  # 此处 sorted(word) == word
        else:
            # 先看是否存在长度为 l-1 的优美单词
            if (l - 1) not in beautiful_by_length:
                continue
            # 取当前单词的前 l-1 个字符,并计算其排序结果
            prefix = word[:-1]
            sorted_prefix = ''.join(sorted(prefix))
            # 检查是否存在一个长度为 l-1 的优美单词,其排序后的字符与 prefix 一致
            found = False
            for bw, bw_sorted in beautiful_by_length[l - 1]:
                if bw_sorted == sorted_prefix:
                    found = True
                    break
            if found:
                beautiful_by_length.setdefault(l, set()).add( (word, ''.join(sorted(word))) )
    return beautiful_by_length

def find_longest_beautiful_word(filename):
    with open(filename, "r", encoding="utf-8") as f:
        # 每一行一个单词,去除空白符
        words = [line.strip() for line in f if line.strip()]
    
    beautiful_by_length = is_beautiful_words(words)
    
    if not beautiful_by_length:
        return ""
    
    # 找到存在的最大长度
    max_len = max(beautiful_by_length.keys())
    
    # 在最大长度中,找出字典序最小的那个单词
    candidates = [word for word, _ in beautiful_by_length[max_len]]
    result = min(candidates) if candidates else ""
    return result

if __name__ == "__main__":
    # 假设文件名为 words.txt
    result = find_longest_beautiful_word("words.txt")
    print("最长的优美字符串为:", result)

C: LQ 图形

def I():
    return input()


def II():
    return int(input())


def MII():
    return map(int, I().split())


def LMII():
    return list(MII())


def solve():
    w, h, v = MII()
    for i in range(h):
        print("Q" * w)
    for i in range(w):
        print("Q" * (w + v))


T = 1
for i in range(T):
    solve()

D: 最多次数

def I():
    return input()


def II():
    return int(input())


def MII():
    return map(int, I().split())


def LMII():
    return list(MII())


def solve():
    s = I()
    check = {'lqb', 'lbq', 'qlb', 'qbl', 'blq', 'bql'}
    res = 0
    i = 0
    # print(len(s))
    while i < len(s) - 2:
        # print(i, s[i:i + 3])
        if s[i:i + 3] in check:
            res += 1
            i += 2
        i += 1
    print(res)


T = 1
for i in range(T):
    solve()

E: A · B Problem

def I():
    return input()


def II():
    return int(input())


def MII():
    return map(int, I().split())


def LMII():
    return list(MII())


def solve():
    L = II()
    res = 0
    lst = [0] * (L + 5)
    for i in range(1, L + 1):
        for j in range(1, L + 1):
            if i * j >= L:
                break
            lst[i * j] += 1
    pre = lst.copy()
    for i in range(1, L):
        pre[i] += pre[i - 1]
    for i in range(1, L):
        cnt1 = i
        cnt2 = L - i
        res += lst[cnt1] * pre[cnt2]
    print(res)


T = 1
for i in range(T):
    solve()

赛时对拍

def I():
    return input()


def II():
    return int(input())


def MII():
    return map(int, I().split())


def LMII():
    return list(MII())


def solve1(n):
    res = 0
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            for k in range(1, n + 1):
                for l in range(1, n + 1):
                    if i * k + j * l <= n:
                        res += 1
                        # print((i, k), (j, l))
    print(res)


def solve2(L):
    res = 0
    lst = [0] * (L + 5)
    for i in range(1, L + 1):
        for j in range(1, L + 1):
            if i * j >= L:
                break
            lst[i * j] += 1
    pre = lst.copy()
    for i in range(1, L):
        pre[i] += pre[i - 1]
    for i in range(1, L):
        cnt1 = i
        cnt2 = L - i
        res += lst[cnt1] * pre[cnt2]
    print(res)


T = 1
for i in range(T):
    L = II()
    solve1(L)
    solve2(L)

F: 园艺

赛时代码,可能超时

def I():
    return input()


def II():
    return int(input())


def MII():
    return map(int, I().split())


def LMII():
    return list(MII())


def solve():
    n = II()
    data = LMII()
    res = 1
    cnt = 1
    for i in range(1, n):
        if data[i] > data[i - 1]:
            cnt += 1
        else:
            res = max(res, cnt)
            cnt = 1
    res = max(res, cnt)
    if res == 1 or res == n:
        print(res)
        return

    for jg in range(2, n):  # 间隔
        if res > (n - 1) // jg + 1:
            break
        for st in range(n - jg):
            cnt = 1
            for idx in range(st + jg, n, jg):
                if data[idx] > data[idx - jg]:
                    cnt += 1
                else:
                    res = max(res, cnt)
                    cnt = 1
            res = max(res, cnt)
    print(res)

T = 1
for i in range(T):
    solve()

赛后优化及对拍

def I():
    return input()


def II():
    return int(input())


def MII():
    return map(int, I().split())


def LMII():
    return list(MII())


def solve1(n, data):
    res = 1
    cnt = 1
    for i in range(1, n):
        if data[i] > data[i - 1]:
            cnt += 1
        else:
            res = max(res, cnt)
            cnt = 1
    res = max(res, cnt)
    if res == 1 or res == n:
        print(res)
        return

    for jg in range(2, n):  # 间隔
        if res > (n - 1) // jg + 1:
            break
        for st in range(n - jg):
            cnt = 1
            for idx in range(st + jg, n, jg):
                if data[idx] > data[idx - jg]:
                    cnt += 1
                else:
                    res = max(res, cnt)
                    cnt = 1
            res = max(res, cnt)
    print(res)

def solve2(n, data):
    dp = [[1 for _ in range(n + 1)] for _ in range(n + 1)]
    for i in range(0, n):
        for j in range(0, i):
            if data[i] > data[j]:
                dp[i][i - j] = dp[j][i - j] + 1
    print(max([max(d) for d in dp]))


T = 1
for i in range(T):
    n = II()
    # data = LMII()
    import random
    data = [random.randint(1, 2 ** 20) for _ in range(n)]
    import time
    t1 = time.time()
    solve1(n, data)
    t2 = time.time()
    solve2(n, data)
    t3 = time.time()
    print(t2 - t1, t3 - t2)

G: 书架还原

# # 考场错误解
# def I():
#     return input()


# def II():
#     return int(input())


# def MII():
#     return map(int, I().split())


# def LMII():
#     return list(MII())


# def solve():
#     n = II()
#     data = [0] + LMII()
#     res = 0
#     for i in range(1, n + 1):
#         if i != data[i]:
#             if i == data[data[i]]:
#                 res += 1
#                 x = data[data[i]]
#                 data[data[i]] = data[i]
#                 data[i] = x
#     print(res, data)
#     cnt = 0
#     for i in range(1, n + 1):
#         if i != data[i]:
#             cnt += 1
#     if cnt:
#         print(res + cnt - 1)
#     else:
#         print(res)


# T = 1
# for i in range(T):
#     solve()

# 正解
n = int(input())
a = list(map(int, input().split()))
visited = [False] * n
ans = 0

for i in range(n):
    if not visited[i] and a[i] != i + 1:
        count = 0
        j = i
        while not visited[j]:
            visited[j] = True
            count += 1
            j = a[j] - 1
        ans += count - 1

print(ans)

H: 异或和

赛时代码,超时

def I():
    return input()


def II():
    return int(input())


def MII():
    return map(int, I().split())


def LMII():
    return list(MII())


def solve1():
    n = II()
    data = LMII()
    res = 0
    for i in range(n - 1):
        for j in range(i + 1, n):
            res += (data[i] ^ data[j]) * (j - i)
    print(res)


T = 1
for i in range(T):
    solve1()

赛时对拍,超时

def I():
    return input()


def II():
    return int(input())


def MII():
    return map(int, I().split())


def LMII():
    return list(MII())


def solve1(n, data):
    res = 0
    for i in range(n - 1):
        for j in range(i + 1, n):
            # print(data[i],data[j],data[i] ^ data[j])
            res += (data[i] ^ data[j]) * (j - i)
    print(res)


def solve2(n, data):
    res = 0
    for j_i in range(1, n):
        cnt = 0
        for i in range(j_i):
            for j in range(i + j_i, n, j_i):
                cnt += data[j - j_i] ^ data[j]
        res += j_i * cnt
    print(res)


T = 1
for i in range(T):
    n = II()
    # data = LMII()
    import random
    data = [random.randint(1, 2 ** 20) for _ in range(n)]
    import time
    t1 = time.time()
    solve1(n, data)
    t2 = time.time()
    solve2(n, data)
    t3 = time.time()
    print(t2 - t1, t3 - t2)

赛后补题

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

for k in range(31):  # 考虑31位足以覆盖正整数的情况
    cnt1 = 0  # 记录当前位为1的个数
    sum1 = 0  # 记录当前位为1的位置之和
    for j in range(1, n + 1):
        b = (a[j - 1] >> k) & 1  # 取出第k位
        if b:
            cnt0 = j - 1 - cnt1
            sum0 = (j - 1) * j // 2 - sum1
            ans += (j * cnt0 - sum0) * (1 << k)
            cnt1 += 1
            sum1 += j
        else:
            ans += (j * cnt1 - sum1) * (1 << k)

print(ans)

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

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

相关文章

旧版 VMware 虚拟机迁移至 KVM 平台-案例2

项目背景 需将一台旧版 VMware 虚拟机&#xff08;VMDK 格式&#xff09;迁移至 KVM 虚拟化平台&#xff0c;具体要求如下&#xff1a; 格式转换&#xff1a;将 VMDK 转换为 QCOW2 格式。磁盘扩容&#xff1a;将原 40GB 磁盘扩展至 60GB。密码重置&#xff1a;修改 aiden 用户…

若依代码生成器原理velocity模板引擎(自用)

1.源码分析 代码生成器:导入表结构(预览、编辑、删除、同步)、生成前后端代码 代码生成器表结构说明&#xff1a; 若依提供了两张核心表来存储导入的业务表信息&#xff1a; gen_table&#xff1a;存储业务表的基本信息 &#xff0c;它对应于配置代码基本信息和生成信息的页…

OpenCV直方图均衡化全面解析:从灰度到彩色图像的增强技术

目录 一、直方图均衡化基础&#xff1a;原理与核心思想 二、彩色图像的直方图均衡化&#xff1a;挑战与解决方案 三、进阶技巧与注意事项 四、应用场景与典型案 一、直方图均衡化基础&#xff1a;原理与核心思想 1. 直方图的本质与作用 直方图是图像像素强度分布的统计图表…

Web前端之Vue+Element实现表格动态复杂的合并行功能、localeCompare、forEach、table、push、sort、Map

MENU 效果图公共数据数据未排序时&#xff08;需要合并的行数据未处于相邻位置&#xff09;固定合并行方法&#xff08;写死&#xff09;动态合并行&#xff0c;行数计算方法当太合并行&#xff0c;合并方法方法&#xff08;函数&#xff09;执行 效果图 公共数据 Html <e…

【DDR 内存学习专栏 1.4 -- DDR 的 Bank Group】

文章目录 BankgroupBankgroup 与 Bank 的关系 DDR4 中的 BankgroupDDR4-3200 8Gb芯片为例组织结构访问场景 实际应用示例 Bankgroup Bankgroup是DDR4及后续标准(DDR5)中引入的一个更高层次的组织结构。它将多个Bank组合在一起形成一个Bankgroup&#xff0c;目的是为了进一步提…

嵌入式进阶:如何选择合适的开发平台?

随着现代工业、物联网以及人工智能技术的迅速发展&#xff0c;嵌入式系统已经由简单的控制器向复杂的高性能系统迈进。从传统家电到智能机器人、从自动驾驶汽车到工业自动化&#xff0c;每一项应用都对嵌入式系统的响应速度、运行稳定性和能耗管理提出了更高要求。在这种背景下…

酶动力学参数预测,瓶颈识别……中科院深圳先进技术研究院罗小舟分享AI在酶领域的创新应用

蛋白质&#xff0c;作为生命的基石&#xff0c;在生命活动中发挥着关键作用&#xff0c;其结构和功能的研究&#xff0c;对创新药物研发、合成生物学、酶制剂生产等领域&#xff0c;有着极其重要的意义。但传统蛋白质设计面临诸多难题&#xff0c;蛋白质结构复杂&#xff0c;序…

kafka4.0浅尝辄止

最近工作中接触消息队列比较多&#xff0c;前几周又看到kafka4.0发布&#xff0c;故写一篇博客对消息队列做一个复盘。 目录 消息队列对比1. Apache Kafka 4.02. RabbitMQ3. RocketMQ4. ActiveMQ5. Apache Pulsar6. NSQ kafka4.0鲜明的新特性Java 版本要求升级API 更新与精简移…

数据库原理及应用mysql版陈业斌实验三

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 实验三多表查询 1.实验数据如下 student 表&#xff08;学生表&#…

OpenHarmony - 小型系统内核(LiteOS-A)(二)

OpenHarmony - 小型系统内核&#xff08;LiteOS-A&#xff09;&#xff08;二&#xff09; 三、基础内核 3.1、中断及异常处理 基本概念 中断是指出现需要时&#xff0c;CPU暂停执行当前程序&#xff0c;转而执行新程序的过程。即在程序运行过程中&#xff0c;出现了一个必须…

数字化引擎再升级:小匠物联十周年庆典与全链路创新实践

4月11日&#xff0c;浙江宁波的小匠物联十周年庆典拉开帷幕。本次活动以“拾阶而上&#xff0c;智创未来”为主题&#xff0c;从全员签到、心愿书写&#xff0c;到董事长致辞、切蛋糕及全体合影&#xff0c;每一个环节都精心设计&#xff0c;展现出企业在家用物联网领域的卓越技…

开发工具-jetbrains使用技巧

更详细的可以看 狂神说Java】JavaWeb入门到实战 p6 idea中maven的操作 可以设置怎么调试 然后还可以wsl、远程方式等运行 maven 这里的相当于cmd的操作 命令行去执行这些东西

HarmonyOS:页面滚动时标题悬浮、背景渐变

一、需求场景 进入到app首页或者分页列表首页时&#xff0c;随着页面滚动&#xff0c;分类tab要求固定悬浮在顶部。进入到app首页、者分页列表首页、商品详情页时&#xff0c;页面滚动时&#xff0c;顶部导航栏&#xff08;菜单、标题&#xff09;背景渐变。 二、相关技术知识点…

信息系统项目管理师-第十八章-项目绩效域

本文章记录学习过程中,重要的知识点,是否为重点的依据,来源于官方教材和历年考题,持续更新共勉 本文章记录学习过程中,重要的知识点,是否为重点的依据,来源于官方教材和历年考题,持续更新共勉 在整个生命周期过程中,项目管理者需要始终坚持项目管理原则,通过涵盖 10 …

[NOIP 2003 普及组] 栈 Java

import java.io.*;public class Main {public static void main(String[] args) throws IOException {BufferedReader br new BufferedReader(new InputStreamReader(System.in));int n Integer.parseInt(br.readLine());int[] dp new int[n 1];dp[0] 1; // 空序列只有一种…

面试篇 - Transformer模型中的位置编码

1. 位置编码的引入 背景&#xff1a;Transformer模型通过自注意力机制&#xff08;Self-Attention&#xff09;处理序列数据&#xff0c;但自注意力机制本身并不包含序列中元素的位置信息。因此&#xff0c;需要一种方法来为模型提供位置信息。 解决方案&#xff1a;位置编码&…

vue+flask图书知识图谱推荐系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01; 编号: F025 架构: vueflaskneo4jmysql 亮点&#xff1a;协同过滤推荐算法知识图谱可视化 支持爬取图书数据&#xff0c;数据超过万条&am…

vue2 走马灯 展示多个

使用 npm install “swiper”: “^11.2.4”, 在这里插入代码片 <template><section class"swiper pc-banner"><div class"swiper-container"><div class"swiper-wrapper"><div v-for"(item, index) in swiperD…

《MySQL从入门到精通》

文章目录 《MySQL从入门到精通》1. 基础-SQL通用语法及分类2. 基础-SQL-DDL-数据库操作3. 基础-SQL-DDL-表操作-创建&查询4. 基础-SQL-DDL-数据类型及案例4.1 数值类型4.2 字符串类型4.3 时间和日期类型 5. 基础-SQL-DDL-表操作-修改&删除5.1 DDL-表操作-修改5.2 DDL-表…