🏆 全国青少年信息素养大赛

算法应用主题赛 — 丝路新程(丝路文化)
难度:中等 | 时长:90 分钟 | 满分:100分
题型:5单选(10分) + 5多选(20分) + 4编程(70分)

算法应用主题赛 — 丝路新程(丝路文化)(中等)
考生:— 第 1 / 14 题
--:--
第 1 题 单选题 2 分
驼队商人在检查货物清单时,想确认所有货物的重量是否都超过了10斤。以下哪个表达式能正确判断?
weights = [15, 20, 12, 18, 25]
第 2 题 单选题 2 分
海上丝绸之路的商人同时维护两份记录:港口名称和对应的贸易额。要同时遍历它们,以下代码的输出是什么?
ports = ["广州", "泉州", "宁波"]
volumes = [5000, 3000, 2000]
for port, vol in zip(ports, volumes):
    if vol >= 3000:
        print(port)
第 3 题 单选题 2 分
在丝路驿站的编号管理中,需要同时获取驿站的序号和名称。以下代码的输出是什么?
stations = ["长安", "敦煌", "楼兰", "大宛"]
for idx, name in enumerate(stations, start=1):
    print(str(idx) + ":" + name)
第 4 题 单选题 2 分
商人需要按利润从高到低排列贸易路线。已知路线数据为:routes = [("长安-敦煌", 500), ("敦煌-楼兰", 300), ("楼兰-大宛", 800)]。执行以下代码后,输出是什么?
result = sorted(routes, key=lambda x: x[1], reverse=True)
print(result[0][0])
第 5 题 单选题 2 分
在丝路贸易数据分析中,使用 collections 模块的 Counter 来统计商品出现频率。以下代码的输出是什么?
from collections import Counter
goods = ["丝绸", "茶叶", "丝绸", "瓷器", "茶叶", "丝绸"]
c = Counter(goods)
print(c.most_common(1)[0][0])
第 6 题 多选题 4 分
在丝路商品清单管理系统中,以下关于列表方法的调用和结果,正确的有?(多选)
items = ["丝绸", "瓷器", "茶叶", "香料", "玉器"]
第 7 题 多选题 4 分
驼队商人用字典管理货物的库存和单价。关于字典的遍历方法,以下说法正确的有?(多选)
inventory = {"丝绸": 500, "瓷器": 200, "茶叶": 50}
第 8 题 多选题 4 分
在丝路贸易数据清洗中,需要验证输入的字符串。关于字符串的验证方法,以下说法正确的有?(多选)
第 9 题 多选题 4 分
商队用文件保存贸易记录。关于Python文件打开模式的说法,正确的有?(多选)
第 10 题 多选题 4 分
在丝路文物数字化项目中,需要处理文件路径。关于 os.path 模块的说法,正确的有?(多选)
第 11 题 编程操作题 0 分

题目描述:
丝绸之路上的商人记录了一段时间内每天的商品交易种类。请你编写程序,使用 Counter 对交易数据进行统计分析。
程序要求:
1. 用户输入一个整数 n,表示有 n 天的交易记录。
2. 接下来输入 n 行,每行是一个商品名称(如"丝绸"、"茶叶"等)。
3. 使用 collections.Counter 统计每种商品出现的次数。
4. 按出现次数从高到低输出统计结果,格式为 商品:X次。
5. 输出出现次数最多的商品名称。

输入格式:
第一行:一个正整数 n。
接下来 n 行:每行一个商品名称(字符串)。

输出格式:
首先输出 ===商品交易统计===。
然后按出现次数从高到低,每行输出一个商品及其次数,格式为 商品:X次。
最后输出 最热销商品:XX。

示例输入:

7
丝绸
茶叶
丝绸
瓷器
茶叶
丝绸
香料

示例输出:

===商品交易统计===
丝绸:3次
茶叶:2次
瓷器:1次
香料:1次
最热销商品:丝绸
第 12 题 编程操作题 0 分

题目描述:
丝绸之路上的驿站之间有一些固定的路线相连。请你编写程序,使用字典存储驿站之间的连通关系,并检查两个驿站之间是否可以直达。
程序要求:
1. 用户首先输入两个整数 n 和 m,以空格分隔:n 表示驿站的数量,m 表示路线数量。
2. 接下来输入 m 行,每行两个字符串(以空格分隔),表示这两个驿站之间有一条直接相连的路线(双向通行)。
3. 用一个字典存储每个驿站相邻的其他驿站列表。
4. 然后输入一个整数 q,表示有 q 次查询。
5. 每次查询输入两个驿站名称(以空格分隔),判断它们是否可以直接到达(即在字典中互为相邻驿站)。如果可以,输出"直达";否则输出"需要中转"。

输入格式:
第一行:两个正整数 n 和 m,以空格分隔。
接下来 m 行:每行两个字符串,表示一条直接路线。
接下来一行:一个正整数 q,表示查询次数。
接下来 q 行:每行两个字符串,表示要查询的两个驿站。

输出格式:
对每次查询,输出"直达"或"需要中转"。

示例输入:

5 4
长安 敦煌
敦煌 楼兰
楼兰 大宛
大宛 长安
3
长安 敦煌
长安 楼兰
敦煌 大宛

示例输出:

直达
需要中转
需要中转
第 13 题 编程操作题 0 分

题目描述:
丝绸之路上的驼队计划一次长途旅行,途中会经过 n 个补给站。驼队从起点(位置 0)出发,终点在 distance 里之外。每个补给站的位置(距离起点的里数)和该站提供的补给品价格(文/份)已知。
驼队需要购买补给品来走完全程。假设每里路需要消耗 1 份补给品。驼队可以在任意补给站购买任意数量的补给品。
请你编写程序,帮驼队计算完成全程所需的最小补给费用。
策略说明:将所有途经点(起点、各补给站、终点)按位置排序。从左到右遍历每一段路程,始终用"到目前为止遇到的最低价格"计算这段路程的费用。

输入格式:
第一行:两个正整数 n 和 distance,以空格分隔,分别表示补给站数量和总路程(里)。
接下来 n 行:每行两个整数 pos 和 price,以空格分隔,分别表示补给站的位置(里)和补给品单价(文/份)。补给站按位置升序给出,且所有位置互不相同。

输出格式:
一行,输出"最小补给费用:X文"(X为最小总费用)。

示例输入:

4 100
10 5
30 3
60 4
80 2

示例输出:

最小补给费用:340文
(解释:
- 起点0→10里:最低价5,费用 10×5 = 50
- 10里→30里:最低价5,费用 20×5 = 100
- 30里→60里:遇到价格3更新最低价为3,费用 30×3 = 90
- 60里→80里:价格4不比3低,最低价保持3,费用 20×3 = 60
- 80里→100里:遇到价格2更新最低价为2,费用 20×2 = 40
- 总费用:50+100+90+60+40 = 340)
第 14 题 编程操作题 0 分

题目描述:
丝绸之路上的丝绸质检员记录了多批丝绸的检测数据。每批丝绸有一个批次号(字符串)和三个检测指标:色泽分(整数0-100)、韧性分(整数0-100)、细度分(整数0-100)。
请你编写程序完成以下功能:
1. 读取数据文件 silk_data.txt(每行格式为 批次号 色泽分 韧性分 细度分)。
2. 计算每批丝绸的综合评分:综合评分 = 色泽分×0.4 + 韧性分×0.35 + 细度分×0.25(保留两位小数)。
3. 按综合评分从高到低排序。
4. 将检测报告写入新文件 silk_report.txt,格式如下:
- 第一行为 ===丝绸质量检测报告===
- 之后每行为 批次号:综合评分 等级,其中等级划分标准为:
- 综合评分 >= 85:优等品
- 综合评分 >= 70 且 < 85:一等品
- 综合评分 >= 60 且 < 70:合格品
- 综合评分 < 60:不合格
5. 如果 silk_data.txt 文件不存在,则在控制台输出"数据文件不存在,请检查。"
6. 如果文件中存在空行,则跳过空行。

输入格式:
无键盘输入。程序读取当前目录下的 silk_data.txt 文件。
silk_data.txt 示例内容:
B001 90 85 80
B002 70 75 80
B003 55 60 50
B004 88 92 90

输出格式:
生成 silk_report.txt 文件,内容格式如下:
===丝绸质量检测报告===
B004:89.70 优等品
B001:84.75 一等品
B002:72.25 一等品
B003:54.50 不合格

示例输入:

示例输出: