--- title: 第十四届蓝桥杯大赛软件赛国赛 Python 研究生组(正在更新) createTime: 2026/01/09 15:57:22 cover: /images/elysia/8.jpg coverStyle: layout: right permalink: /archives/b1c77a1d-d402-4788-8049-fa3aeb12ebd0/ --- ## 一、X 质数 ### 题目 题目链接:0X质数 - 蓝桥云课 ### 问题描述 对于一个含有 M 个数位的正整数 N ,任意选中其中 K 个不同的数位(0≤K 0: num -= ( sum(map(int,str(num))) + j ) ans += 1 difference[i][j] = num step[i][j] = ans # 当 num 小于 1000 的时候直接返回 num = int(input()) if num < 1000: print(step[num][0]) else: ans = 0 while num: if num < 1000: ans += step[num][0] break # x 为前六位 # y 为后三位 x = num // 1000 y = num % 1000 # 直接加上步数,以及溢出的值即可 ans += step[y][sum(map(int,str(x)))] num = x * 1000 + difference[y][sum(map(int,str(x)))] print(ans) ``` ## 四、火车运输 ## 五、最大区间 ### 题目 题目链接:0最大区间 - 蓝桥云课 ### 问题描述 给定一个长度为 n 的序列 Ai​,求 L,R 使 (R−L+1)⋅min⁡(AL,AL+1,…,AR) 尽可能大,其中 min⁡ 表示最小值。 你只需要输出最大的值即可,不需要输出具体的 L,R。 ### 解析 这道题要求给定字符串中的 (R−L+1)⋅min⁡(AL,AL+1,…,AR) 的最大值,每次计算区间内的最小值再扩展区间很麻烦,我们可以转换一下思路以当前元素为区间内的最小元素,视为右边界,然后不断向左边扩展,一直到小于当前元素的位置停下,就可以得到当前区间的结果。(这里为什么不用向右边扩展,因为如果存在这种情况的话,右边向左扩展的时候会包括这一段)我们可以采用单调递增栈来加快寻找的速度,0 是为了确保清空栈。 可以用下面这个例子 debug 一下程序查看运行过程。 n = 6 A = [1,2,3,2,3,2] (感觉解释的还是不太够清楚,有啥问题可以直接评论) ### 答案 ```python import os import sys n = int(input()) A = list(map(int,input().split())) A.append(0) stack = [] ans = 0 for i in range(n+1): while stack and A[i] <= A[stack[-1]]: prev_i = stack.pop() L = stack[-1] if stack else -1 ans = max( ( i - L - 1 ) * A[prev_i] ,ans) stack.append(i) print(ans) ``` ## 六、等腰三角形 ## 七、连续数组 ## 八、质数排序 ## 九、选段排序 ## 十、最长同类子串