第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
第十六届蓝桥杯大赛软件赛决赛
Python 大学 A 组
【选手须知】
考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试
题。
考试时间为 4 小时。考试期间选手可浏览自己已经提交的答案,被浏览的
答案允许拷贝。时间截止后,将无法继续提交或浏览答案。
对同一题目,选手可多次提交答案,以最后一次提交的答案为准。
选手必须通过浏览器方式提交自己的答案。选手在其它位置的作答或其它
方式提交的答案无效。
试题包含"结果填空"和"程序设计"两种题型。
结果填空题:要求选手根据题目描述直接填写结果。求解方式不限。不要
求源代码。把结果填空的答案直接通过网页提交即可,不要书写多余的内容。
程序设计题:要求选手设计的程序对于给定的输入能给出正确的输出结果。
考生的程序只有能运行出正确结果才有机会得分。
注意:在评卷时使用的输入数据与试卷中给出的示例数据可能是不同的。
选手的程序必须是通用的,不能只对试卷中给定的数据有效。
所有源码必须在同一文件中。调试通过后,拷贝提交。
对于编程题目,不能使用诸如绘图、硬件操作或与操作系统相关的 API。
注意: 所有依赖的模块(如 math)必须明确地在源文件中 import。只能
使用 python 自带的模块,使用 pip 等安装的扩展模块无法使用。
所有源码必须在同一文件中。调试通过后,拷贝提交。
第十六届蓝桥杯大赛软件赛决赛
1第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
试题 **A:**最大周长
本题总分:5 分
【问题描述】
已知一个长方形的面积为 2025,且其长和宽均为正整数。现在,请你计算
这个长方形可能的最大周长是多少。
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
试题 A: 最大周长
2第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
试题 **B:**特殊整数对的数量
本题总分:5 分
【问题描述】
我们称一对正整数 (a, b) 是 "特别互素对",如果满足以下条件:
- 1 ≤ a< b≤ 106 。
- a与 b互素,即 a和 b的最大公约数为 1 。
- a+ b是 2025 的倍数。
请计算一共有多少对 (a, b) 是 "特别互素对"。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个数字,在提交答案时只填写这个数字,填写多余的内容将无法得分。
试题 B: 特殊整数对的数量
3第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
试题 C:铺设能源管道
时间限制: 10.0s
内存限制: 512.0MB
本题总分:10 分
【问题描述】
能源公司正着手建立新的基地。为了确保基地的能源供应,公司计划铺设
一条长度至少为 n公里的能源管道。铺设管道的成本并非简单地与管道长度成
正比,而是由管道长度的各位数字之和决定。例如,铺设 123 公里的管道,实
际成本为 1 + 2 + 3 = 6 。
为了尽可能降低成本,公司希望找到一个长度为 m公里的铺设方案,使得
m不小于 n,并且 m的数位和最小。如果存在多个满足条件的 m,则选择数值
最小的方案,以确保在成本相同的情况下,尽可能减少资源浪费。
现在,请你帮助能源公司计算出最优的管道铺设长度 m。
【输入格式】
输入一行包含一个整数 n,表示需要铺设的最低管道长度。
【输出格式】
输出一行包含一个整数 m,表示最优的管道铺设长度。
【样例输入】
9
【样例输出】
10
【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ n≤ 100。
对于所有的评测用例,1 ≤ n≤ 109。
试题 C: 铺设能源管道
4第十六届蓝桥杯大赛软件赛决赛Python大学A组
试题 D:倒排索引
时间限制: 10.0s
内存限制: 512.0MB
本题总分:10 分
【问题描述】
在信息检索系统中,倒排索引是一种常用的数据结构,用于快速查找包含
特定词语的文档集合。为了增强搜索的灵活性,我们引入了 N-Gram 分词算法,
参数 *min*, *max*,表示分别按照长度 min、min+ 1、· · · 、max对单词进行滑动窗
口截取。例如对于 3, 5 的 N-Gram,会将单词 lanqb 分割为 lan, anq, nqb, lanq, anqb, lanqb 的索引序列,如果文档长度小于 min,那么索引序列只包
含文档本身。
给定 n个文档,对于第 i个文档 *di,利用上述的 N-Gram 算法为其生成一
组索引序列 *Li。对于查询词 q,也对其应用 N-Gram 为其生成一个索引序列 P
,如果序列 P中的某个单词出现在序列 *Li中,那么就认为查询词和文档 d**i匹
配成功。
请统计查询词 q能与多少个文档匹配成功。
【输入格式】
输入的第一行包含三个正整数 n,min,max,相邻整数之间使用一个空
格分隔。
接下来 n行,每行包含一个字符串,其中第 i行的字符串表示文档 d**i。
接下来一行包含一个字符串,表示查询词 q。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
3 3 4
angel
试题D: 倒排索引
5第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
ac
angle
lang
【样例输出】
2
【样例说明】
文档分词结果如下:
angel:ang, nge, gel, ange, ngel
ac:ac
angle:ang, ngl, gle, angl, ngle
查询词分词结果如下:
lang:lan, ang, lang
angel 和 angle 的分词中都包含 ang ,所以答案为 2。
【评测用例规模与约定】
设 |s| 表示字符串 s的长度。
对于 50% 的评测用例,1 ≤ n≤ 100;
对于所有评测用例,1 ≤ n≤ 103,1 ≤ min≤ max≤ 20,1 ≤ |d**i|, |q| ≤ 20 ,d**i
和 q都只包含小写英文字母。
试题 D: 倒排索引
6第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
试题 E:上升序列构造
时间限制: 10.0s
内存限制: 512.0MB
本题总分:15 分
【问题描述】
小蓝手里有一个长度为 n的十进制正整数序列 (a1, a2, · · · , *an),他希望修改
这个序列中的一些数使其变为一个上升序列,即满足对于所有的 i,2 ≤ i≤ n,
都有 *a*i−1 < a**i。他只能通过在这些正整数的十进制表示中增加数字 0 来构造这
个上升序列,他想知道最少增加多少个 0 可以满足条件。
【输入格式】
输入的第一行包含一个正整数 n。
第二行包含 n个正整数 a1, a2, · · · , a**n,相邻整数之间使用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
6
527559 483873 913413 181072 822487 853172
【样例输出】
8
【样例说明】
其中一种方案,更改后的序列为 (527559, 4083873, 9013413, 10081072,
80022487, 85003172) ,共增加 8 个 0 。
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ n≤ 10 ;
试题 E: 上升序列构造
7第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
对于所有评测用例,1 ≤ n≤ 5000,1 ≤ a**i≤ 106。增加 0 之后允许超过 106。
试题 E: 上升序列构造
8第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
试题 F:哨兵
时间限制: 10.0s
内存限制: 512.0MB
本题总分:15 分
【问题描述】
小蓝是一位国王,他的王国里有 n座城市,通过 n− 1 条路来连通。他想在
城市中部署三组哨兵 A、B、C,每组哨兵部署在一个城市里面,一个城市可
以部署多组哨兵。其中 A到 B的距离需要和 A到 C的距离相同。小蓝想知道
B到 C的距离最大是多少。
【输入格式】
输入的第一行包含一个正整数 n。
接下来 n− 1 行,每行包含两个正整数 *ui, *vi*,用一个空格分隔,表示城市
*ui*和城市 *vi*之间有一条路。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
8
1 2
1 3
1 4
4 5
4 6
6 7
7 8
【样例输出】
4
试题 F: 哨兵
9第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
【样例说明】
其中一种方案:A部署在 5 ,B部署在 3 ,C部署在 7 。
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ n≤ 500 ;
对于所有评测用例,1 ≤ n≤ 5000 ,1 ≤ *ui*, *vi*≤ n。
试题 F: 哨兵
10第十六届蓝桥杯大赛软件赛决赛Python大学A组
试题 G:巡逻
时间限制: 10.0s
内存限制: 512.0MB
本题总分:20 分
【问题描述】
边境森林中分布着若干重要的哨站,所有哨站之间由隐秘小径相连,形成
一张天然的巡逻网络。这张网络的结构恰好是一棵树。为了防止敌人渗透,小
蓝每天需要执行固定长度为 k的巡逻任务。每次巡逻从一个哨站出发,经过不
重复地恰好 k条道路,最终到达另一个哨站。每条道路都有一定的危险值,巡
逻路径上危险值的和代表该次巡逻时的风险。两次巡逻路径不相同当且仅当它
们的起点不同或终点不同。
现在指挥官希望知道,所有可能的长度为 k的巡逻路线的风险之和是多少?
【输入格式】
输入的第一行包含两个正整数 n, k,用一个空格分隔。
接下来 n− 1 行,每行包含三个正整数 *ui, *vi*,w**i,相邻整数之间使用一个空
格分隔。表示结点 u**i和结点 v**i之间有一条危险值为 w**i边。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
7 2
1 2 3
2 4 5
1 3 7
3 5 3
3 6 4
6 7 2
试题G: 巡逻
11第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
【样例输出】
104
【样例说明】
所有可能的路径及其风险值如下:
1 → 2 → 4 : 8
2 → 1 → 3 : 10
1 → 3 → 5 : 10
1 → 3 → 6 : 11
5 → 3 → 6 : 7
3 → 6 → 7 : 6
以上路径反过来也是合法的,所以总共有 14 条不同的路径,风险之和为
104。
【评测用例规模与约定】
对于 40% 的评测用例,1 ≤ n≤ 500 ;
对于所有评测用例,1 ≤ n≤ 5000 ,1 ≤ k≤ n,1 ≤ u**i, v**i≤ n,1 ≤ w**i≤ 106。
试题 G: 巡逻
12第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
试题 H:网络流量监控
时间限制: 10.0s
内存限制: 512.0MB
本题总分:20 分
【问题描述】
网络安全团队需要开发一个系统来监控和检测恶意网络流量。他们收集了
一系列已知的恶意请求路径模式,每个模式都有一个对应的风险等级。你的任
务是实现一个算法,检测给定的网络请求路径是否匹配这些模式,并返回匹配
模式中最高的风险等级。下面是恶意请求路径的相关描述:
路径格式
• 路径由斜杠(/)分隔的若干段组成,如 /api/users/profile 。
• 路径总是以斜杠(/)开头。
• 路径中的每一段可以是由小写英文字母和数字组成的非空字符串。当路径
为路径模式时,路径中的一段还可以是通配符 * 或 ** 。
通配符规则
• 通配符包括单通配符(*)和双通配符(**),只能是路径模式中的完整
一段。一个路径中最多有一段通配符,不能出现两个单通配符,不能出现
两个双通配符,也不能同时出现单通配符和双通配符。
• 单通配符(*)用于匹配路径中的任意一段。
例如:/api/*/delete 可以匹配 /api/users/delete 或
/api/files/delete,但不能匹配 /api/admin/users/delete 。
• 双通配符(**)用于匹配路径中的零段或连续多段。
例如:/api/admin/** 可以匹配 /api/admin、/api/admin/users
或 /api/admin/users/profile 。
试题 H: 网络流量监控
13第十六届蓝桥杯大赛软件赛决赛Python大学A组
例如:/static/**/execute 可以匹配 /static/execute 、
/static/js/execute 或 /static/css/js/execute 。
风险评估
• 每个恶意路径模式都有一个风险等级。
• 如果一个请求同时匹配多个模式,返回风险等级最高的。
• 如果不匹配任何模式,返回 SAFE。
你需要实现一个算法,给定恶意请求路径模式集合和一系列网络请求路径,
判断每个网络请求是否触发警报,并且返回触发的最高风险等级。
【输入格式】
输入的第一行包含一个正整数 n,表示恶意路径模式的数量。
接下来 n行,每行包含一个整数 *li*和一个字符串 *pi*,用一个空格分隔,表
示一个恶意请求路径模式,l**i表示风险等级,p**i表示路径模式。
接下来一行包含一个整数 m,表示要检测的网络请求数量。
接下来 m行,每行包含一个字符串 q**i,表示一个网络请求路径。
【输出格式】
对于每个网络请求路径,输出一行,包含检测结果。如果触发警报,输出
ALERT: 风险等级;如果没有触发警报,输出 SAFE。
【样例输入】
5
80 /api/admin/**
60 /api/*/delete
75 /*/config/system
90 /api/users/*/password
50 /static/**/execute
8
试题H: 网络流量监控
14第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
/api/users/profile
/api/admin/users
/api/config/delete
/dev/config/system
/static/js/execute
/api/users/123/password
/static/css/js/execute
/api/admin
【样例输出】
SAFE
ALERT: 80
ALERT: 60
ALERT: 75
ALERT: 50
ALERT: 90
ALERT: 50
ALERT: 80
【样例说明】
1./api/users/profile - 不匹配任何模式,所以是 SAFE 。
2./api/admin/users - 匹配 /api/admin/**,风险等级 80 。
3./api/config/delete - 匹配 /api/*/delete,其中 * 匹配 config,
风险等级 60 。
4./dev/config/system - 匹配 /*/config/system,其中 * 匹配 dev,
风险等级 75 。
5./static/js/execute - 匹配 /static/**/execute,其中 ** 匹配
js,风险等级 50 。
6./api/users/123/password - 匹配 /api/users/*/password,其
中 * 匹配 123,风险等级 90 。
7./static/css/js/execute - 匹配 /static/**/execute,其中 **
试题 H: 网络流量监控
15第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
匹配 css/js,风险等级 50 。
8./api/admin - 匹配 /api/admin/**,其中 ** 匹配空(0 个段),风
险等级 80 。
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ n≤ 10, 1 ≤ m≤ 10 ;
对于 40% 的评测用例,1 ≤ n≤ 100, 1 ≤ m≤ 100 ;
对于 60% 的评测用例,1 ≤ n≤ 1000, 1 ≤ m≤ 1000 ;
对于所有评测用例,1 ≤ n≤ 10, 000 ,1 ≤ m≤ 1000 ,1 ≤ l**i≤ 50000 ,
1 ≤ |p**i| ≤ 50 ,1 ≤ |q**i| ≤ 50 。
试题 H: 网络流量监控
16第十六届蓝桥杯大赛软件赛决赛Python大学A组
试题 I:杨辉三角
时间限制: 10.0s
内存限制: 512.0MB
本题总分:25 分
【问题描述】
小蓝最近迷上了杨辉三角, 杨辉三角是一个无限向下递增的数字三角形。下
图展示了杨辉三角的前 11 行:
我们定义函数 f(i) 表示数字 i在杨辉三角中出现的次数(其中 i≥ 2)。
现在,给定一个正整数 n(n≥ 2),请你完成以下任务:
• 对于所有满足 2 ≤ x≤ n的整数 x,计算出对应的 f(x);
• 将所有具有相同 f(x) 值的数字归为一组;
• 统计并输出每个不同的 f(x) 值出现了多少次。
【输入格式】
输入一行包含一个正整数 n。
【输出格式】
输出若干行。第 i行包含两个整数 *vi, *ci*,用一个空格分隔,表示使得函数
f(x) = *vi*的个数为 *ci*。按照 *vi*从小到大的顺序输出。
试题I: 杨辉三角
17第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
【样例输入】
5
【样例输出】
1 1
2 3
【样例说明】
x的取值范围是 2, 5,其中 f(2) = 1, f(3) = f(4) = f(5) = 2,即值为 1
出现了 1 次,值为 2 出现了 3 次。
【评测用例规模与约定】
对于 20% 的评测用例,2 ≤ n≤ 100 ;
对于 40% 的评测用例,2 ≤ n≤ 1000 ;
对于 60% 的评测用例,2 ≤ n≤ 10, 000 ;
对于所有评测用例,2 ≤ n≤ 100, 000 。
试题 I: 杨辉三角
18第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
试题 J:心意
时间限制: 10.0s
内存限制: 512.0MB
本题总分:25 分
【问题描述】
小蓝有一个序列 a,同时他的朋友小乔有一个序列 b。
我们认为两个序列是和谐的,当且仅当存在某个数 x,使得对于所有的 i
有 *ai+ x= *bi*。
现在小蓝可以让序列 a旋转,即通过一次参数为 k的旋转可以将序列
a1, a2, · · · , a**n变为 a1+k, a2+k, · · · , a**n, a1, a2, · · · , a**k。
小蓝希望知道,是否存在这样的旋转操作,能够让序列 a和 b是和谐的。
输出共一行,一个自然数 k表示参数为 k的旋转操作能够让 a, b是和谐的,
如果存在多个这样的 k,请输出最小的 k,如果不存在这样的 k,请输出 −1 。
【输入格式】
输入的第一行包含一个正整数 n。
第二行包含 n个正整数 a1, a2, · · · , a**n,相邻整数之间使用一个空格分隔。
第三行包含 n个正整数 b1, b2, · · · , b**n,相邻整数之间使用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案,如果不存在,请输出整数 -1 。
【样例输入】
4
2 3 4 5
2 3 4 1
【样例输出】
1
试题 J: 心意
19第十六届蓝桥杯大赛软件赛决赛 Python 大学 A 组
【样例说明】
小蓝可以让序列 a旋转得到 3 4 5 2 ,根据和谐序列的定义,令 x= −1 ,
那么此时 a, b就是和谐的。
【评测用例规模与约定】
对于 50% 的评测用例,n≤ 3000 ;
对于 80% 的评测用例,对于任意 i, j有 a**i, a**j;
对于所有评测用例,1 ≤ n≤ 5 × 105 ,1 ≤ a**i, b**i≤ 109 。
试题 J: 心意
20