🔒 答案已锁定

📖 答案解析 — 丝路新程(丝路文化) — 中等

算法应用主题赛 · Python · 共 14 题(5单选+5多选+4编程)· 满分 100 分

第 1 题 单选题 2 分
驼队商人在检查货物清单时,想确认所有货物的重量是否都超过了10斤。以下哪个表达式能正确判断?
weights = [15, 20, 12, 18, 25]
A. any([w > 10 for w in weights])
B. all([w > 10 for w in weights])
C. min(weights) > 10
D. B 和 C 都可以
✅ 正确答案:D
💡 考点解析:all() 和 any() 函数、列表的元素判断
第 2 题 单选题 2 分
海上丝绸之路的商人同时维护两份记录:港口名称和对应的贸易额。要同时遍历它们,以下代码的输出是什么?
ports = ["广州", "泉州", "宁波"]
volumes = [5000, 3000, 2000]
for port, vol in zip(ports, volumes):
    if vol >= 3000:
        print(port)
A. 广州 泉州
B. 广州 和 泉州(分两行输出)
C. 泉州 宁波
D. 程序报错
✅ 正确答案:B
💡 考点解析:zip() 函数的使用
第 3 题 单选题 2 分
在丝路驿站的编号管理中,需要同时获取驿站的序号和名称。以下代码的输出是什么?
stations = ["长安", "敦煌", "楼兰", "大宛"]
for idx, name in enumerate(stations, start=1):
    print(str(idx) + ":" + name)
A. 输出 0:长安 到 3:大宛
B. 输出 1:长安 到 4:大宛
C. 报错,因为 enumerate 不能指定起始编号
D. 输出 start:长安 到 start:大宛
✅ 正确答案:B
💡 考点解析:enumerate() 函数的 start 参数
第 4 题 单选题 2 分
商人需要按利润从高到低排列贸易路线。已知路线数据为:routes = [("长安-敦煌", 500), ("敦煌-楼兰", 300), ("楼兰-大宛", 800)]。执行以下代码后,输出是什么?
result = sorted(routes, key=lambda x: x[1], reverse=True)
print(result[0][0])
A. 长安-敦煌
B. 敦煌-楼兰
C. 楼兰-大宛
D. 800
✅ 正确答案:C
💡 考点解析:sorted() 函数的 key 参数与 reverse 参数
第 5 题 单选题 2 分
在丝路贸易数据分析中,使用 collections 模块的 Counter 来统计商品出现频率。以下代码的输出是什么?
from collections import Counter
goods = ["丝绸", "茶叶", "丝绸", "瓷器", "茶叶", "丝绸"]
c = Counter(goods)
print(c.most_common(1)[0][0])
A. "丝绸"
B. 3
C. ("丝绸", 3)
D. "茶叶"
✅ 正确答案:A
💡 考点解析:collections.Counter 的 most_common() 方法
第 6 题 多选题 4 分
在丝路商品清单管理系统中,以下关于列表方法的调用和结果,正确的有?(多选)
items = ["丝绸", "瓷器", "茶叶", "香料", "玉器"]
A. items.pop() 删除并返回最后一个元素 "玉器"
B. items.pop(1) 删除并返回索引为 1 的元素 "瓷器"
C. items.index("茶叶") 的返回值是 2
D. items.count("丝绸") 的返回值是 1
✅ 正确答案:ABCD
💡 考点解析:列表方法(pop、index、count)
第 7 题 多选题 4 分
驼队商人用字典管理货物的库存和单价。关于字典的遍历方法,以下说法正确的有?(多选)
inventory = {"丝绸": 500, "瓷器": 200, "茶叶": 50}
A. for key in inventory: 默认遍历字典的键
B. for value in inventory.values(): 遍历字典的所有值
C. for key, value in inventory.items(): 同时遍历键和值
D. 遍历字典时每次获取的键值对顺序和插入顺序一致(Python 3.7+)
✅ 正确答案:ABCD
💡 考点解析:字典的遍历方式(keys、values、items)
第 8 题 多选题 4 分
在丝路贸易数据清洗中,需要验证输入的字符串。关于字符串的验证方法,以下说法正确的有?(多选)
A. "12345".isdigit() 的结果是 True
B. "abc123".isalpha() 的结果是 True
C. "Hello".islower() 的结果是 False
D. "trade.txt".endswith(".txt") 的结果是 True
✅ 正确答案:ACD
💡 考点解析:字符串验证方法(isdigit、isalpha、islower、endswith)
第 9 题 多选题 4 分
商队用文件保存贸易记录。关于Python文件打开模式的说法,正确的有?(多选)
A. "r" 模式:只读打开,文件必须存在,否则报错
B. "w" 模式:写入打开,若文件存在则清空原有内容,若不存在则创建
C. "a" 模式:追加打开,写入内容追加到文件末尾,文件不存在则创建
D. "r+" 模式:读写打开,文件必须存在,可以读取和写入
✅ 正确答案:ABCD
💡 考点解析:文件打开模式(r、w、a、r+)
第 10 题 多选题 4 分
在丝路文物数字化项目中,需要处理文件路径。关于 os.path 模块的说法,正确的有?(多选)
A. os.path.exists(path) 可以判断文件或目录是否存在
B. os.path.join("data", "trade.txt") 可以拼接路径,在不同操作系统上使用正确的分隔符
C. os.path.splitext("trade.txt") 返回 ("trade", ".txt")
D. os.path.basename("/data/silk/trade.txt") 返回 "silk"
✅ 正确答案:ABC
💡 考点解析:os.path 模块常用函数(exists、join、splitext、basename 返回 "trade.txt")
第 11 题 编程操作题 15 分

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

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

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

示例输入:

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

示例输出:

===商品交易统计===
丝绸:3次
茶叶:2次
瓷器:1次
香料:1次
最热销商品:丝绸
✅ 参考答案:
📖 参考代码
from collections import Counter
n = int(input())
goods = []
for _ in range(n):
    goods.append(input())
counter = Counter(goods)
print("===商品交易统计===")
for name, count in counter.most_common():
    print(name + ":" + str(count) + "次")
if len(counter) > 0:
    most_common_name = counter.most_common(1)[0][0]
    print("最热销商品:" + most_common_name)
第 12 题 编程操作题 15 分

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

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

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

示例输入:

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

示例输出:

直达
需要中转
需要中转
✅ 参考答案:
📖 参考代码
n, m = map(int, input().split())
# 建立邻接表
adj = {}
for _ in range(m):
    a, b = input().split()
    if a not in adj:
        adj[a] = []
    if b not in adj:
        adj[b] = []
    adj[a].append(b)
    adj[b].append(a)
q = int(input())
for _ in range(q):
    s1, s2 = input().split()
    if s1 in adj and s2 in adj[s1]:
        print("直达")
    else:
        print("需要中转")
第 13 题 编程操作题 20 分

题目描述:
丝绸之路上的驼队计划一次长途旅行,途中会经过 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)
✅ 参考答案:
📖 参考代码
n, distance = map(int, input().split())
# 收集所有途经点:(位置, 价格)
# 起点(0)没有价格,使用第一个补给站的价格作为初始价格
points = [(0, -1)]
for _ in range(n):
    pos, price = map(int, input().split())
    points.append((pos, price))
points.append((distance, -1))  # 终点
# 初始最低价格设为第一个补给站的价格
min_price = points[1][1]
total_cost = 0
for i in range(1, len(points)):
    # 更新最低价格
    if points[i][1] != -1 and points[i][1] < min_price:
        min_price = points[i][1]
    # 计算当前段的距离和费用
    seg_length = points[i][0] - points[i - 1][0]
    total_cost += seg_length * min_price
print("最小补给费用:" + str(total_cost) + "文")
第 14 题 编程操作题 20 分

题目描述:
丝绸之路上的丝绸质检员记录了多批丝绸的检测数据。每批丝绸有一个批次号(字符串)和三个检测指标:色泽分(整数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 不合格

示例输入:

示例输出:

✅ 参考答案:
📖 参考代码
def calc_score(color, tough, fine):
    return round(color * 0.4 + tough * 0.35 + fine * 0.25, 2)
def get_grade(score):
    if score >= 85:
        return "优等品"
    elif score >= 70:
        return "一等品"
    elif score >= 60:
        return "合格品"
    else:
        return "不合格"
try:
    with open("silk_data.txt", "r", encoding="utf-8") as f:
        lines = f.readlines()
except FileNotFoundError:
    print("数据文件不存在,请检查。")
else:
    records = []
    for line in lines:
        line = line.strip()
        if line == "":
            continue
        parts = line.split()
        batch_id = parts[0]
        color = int(parts[1])
        tough = int(parts[2])
        fine = int(parts[3])
        score = calc_score(color, tough, fine)
        records.append((batch_id, score))
    # 按综合评分降序排序
    records.sort(key=lambda x: x[1], reverse=True)
    with open("silk_report.txt", "w", encoding="utf-8") as f:
        f.write("===丝绸质量检测报告===\n")
        for batch_id, score in records:
            grade = get_grade(score)
            f.write(batch_id + ":" + str(score) + " " + grade + "\n")