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

题面链接Htlang/2025lqb_python_b

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

**A:**攻击次数

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

python 复制代码
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(洛谷的答案)

python 复制代码
# # 考场错误解
# 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图形

python 复制代码
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:**最多次数

python 复制代码
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

python 复制代码
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()

赛时对拍

python 复制代码
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:**园艺

赛时代码,可能超时

python 复制代码
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()

赛后优化及对拍

python 复制代码
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:**书架还原

python 复制代码
# # 考场错误解
# 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:**异或和

赛时代码,超时

python 复制代码
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()

赛时对拍,超时

python 复制代码
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)
相关推荐
刃神太酷啦2 小时前
基础算法篇(5)(蓝桥杯常考点)—动态规划(C/C++)
数据结构·c++·算法·leetcode·蓝桥杯·动态规划·蓝桥杯c++组
Jerry说前后端5 小时前
2025年第十六届蓝桥杯省赛C++ 研究生组真题
c++·算法·蓝桥杯
Jerry说前后端5 小时前
2025年第十六届蓝桥杯省赛C++ A组真题
java·c++·蓝桥杯
a东方青13 小时前
[16届蓝桥杯 2025 c++省 B] 移动距离
c++·算法·蓝桥杯
学c++的一天14 小时前
蓝桥杯备战
算法·职场和发展·蓝桥杯
zero.cyx16 小时前
蓝桥杯 DFS
算法·蓝桥杯·深度优先
ChoSeitaku18 小时前
NO.91十六届蓝桥杯备战|图论基础-图的存储和遍历|邻接矩阵|vector|链式前向星(C++)
c++·蓝桥杯·图论
ChoSeitaku19 小时前
NO.88十六届蓝桥杯备战|动态规划-多重背包|摆花(C++)
c++·蓝桥杯·动态规划
Ray-国21 小时前
2025蓝桥杯JavaB组
java·职场和发展·蓝桥杯
路过刷题1 天前
第16届蓝桥杯c++省赛c组个人题解
c语言·c++·蓝桥杯