🔒 答案已锁定

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

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

第 1 题 单选题 2 分
在丝绸之路贸易中,商人用集合记录交易的货币种类。执行以下代码后,currencies 中包含多少个元素?
currencies = {"铜钱", "银两", "金币"}
currencies.add("银两")
currencies.add("绢帛")
A. 3
B. 4
C. 5
D. 程序报错
✅ 正确答案:B
💡 考点解析:集合(set)的去重特性与add方法
第 2 题 单选题 2 分
在驼队货物清单中,每件货物用一个元组记录(名称,数量)。以下代码的输出结果是什么?
goods = [("丝绸", 10), ("瓷器", 5), ("茶叶", 20)]
for name, qty in goods:
    print(name, end=" ")
A. 丝绸 瓷器 茶叶
B. 丝绸10 瓷器5 茶叶20
C. ("丝绸", 10) ("瓷器", 5) ("茶叶", 20)
D. 10 5 20
✅ 正确答案:A
💡 考点解析:元组解包(tuple unpacking)
第 3 题 单选题 2 分
海上丝绸之路的商人想筛选出重量超过100斤的货物。以下列表推导式的输出是什么?
weights = [80, 120, 95, 150, 60]
heavy = [w for w in weights if w > 100]
print(heavy)
A. [120, 150]
B. [80, 95, 60]
C. [True, False, True, False, True]
D. [80, 120, 95, 150, 60]
✅ 正确答案:A
💡 考点解析:列表推导式(list comprehension)
第 4 题 单选题 2 分
商人需要按商品单价排序。以下 lambda 表达式的功能是什么?
goods = [("丝绸", 500), ("茶叶", 50), ("瓷器", 200)]
goods.sort(key=lambda x: x[1])
A. 按商品名称的字母顺序排序
B. 按商品单价从小到大排序
C. 按商品单价从大到小排序
D. 按商品名称的长度排序
✅ 正确答案:B
💡 考点解析:lambda 表达式、sort() 的 key 参数
第 5 题 单选题 2 分
在海上丝路的航行记录中,需要记录每次航行的日期。以下代码的输出是什么?
from datetime import date, timedelta
departure = date(2026, 7, 8)
arrival = departure + timedelta(days=30)
print(arrival.month)
A. 7
B. 8
C. 9
D. 6
✅ 正确答案:B
💡 考点解析:datetime 模块的基本使用(2026年7月8日 + 30天 = 2026年8月7日,月份为8)
第 6 题 多选题 4 分
在丝路贸易数据报表中,商人用不同的方式格式化输出。关于Python字符串格式化的说法,正确的有?(多选)
A. "商品:%s,数量:%d" % ("丝绸", 10) 可以正确格式化输出
B. "商品:{},数量:{}".format("瓷器", 5) 可以正确格式化输出
C. 在Python 3.6+中,可以使用 f-string:f"商品:{name},数量:{qty}"
D. 以上三种格式化方式得到的结果完全相同
✅ 正确答案:ABC
💡 考点解析:字符串格式化(%格式化、format()、f-string)
第 7 题 多选题 4 分
商队记录了一座城市到其他城市的贸易利润,用字典存储了每个城市的利润数据。关于以下代码分析,正确的有?(多选)
profits = {"长安->敦煌": 500, "敦煌->楼兰": 300, "楼兰->大宛": 800}
A. 可以用 profits.keys() 获取所有的路线名称
B. 可以用 profits.values() 获取所有的利润值
C. {k: v for k, v in profits.items() if v > 400} 的结果是 {"长安->敦煌": 500, "楼兰->大宛": 800}
D. 字典推导式不能包含条件判断
✅ 正确答案:ABC
💡 考点解析:字典方法(keys、values、items)、字典推导式
第 8 题 多选题 4 分
海上丝路的航道数据存储在一个列表中,需要提取特定部分进行分析。关于列表切片,以下说法正确的有?(多选)
ports = ["广州", "泉州", "宁波", "福州", "登州", "扬州"]
A. ports[1:4] 的结果是 ["泉州", "宁波", "福州"]
B. ports[:3] 的结果是 ["广州", "泉州", "宁波"]
C. ports[-3:] 的结果是 ["福州", "登州", "扬州"]
D. ports[::2] 的结果是 ["广州", "宁波", "登州"]
✅ 正确答案:ABCD
💡 考点解析:列表切片 [start:end:step]
第 9 题 多选题 4 分
在丝路驿站管理系统中,需要定义一个函数来处理不确定数量的驿站费用。关于 *args 和 **kwargs 的说法,正确的有?(多选)
A. *args 用于接收任意数量的位置参数,在函数内部以元组形式使用
B. **kwargs 用于接收任意数量的关键字参数,在函数内部以字典形式使用
C. def func(a, *args, **kwargs) 是合法的函数定义
D. **kwargs 只能接收字符串类型的值
✅ 正确答案:ABC
💡 考点解析:*args 和 **kwargs(可变参数)
第 10 题 多选题 4 分
驼队商人用计算机模拟天气变化对行程的影响。关于 random 模块的说法,正确的有?(多选)
A. random.randint(1, 10) 可以生成一个 1 到 10 之间(含 1 和 10)的随机整数
B. random.choice(["晴天", "沙暴", "雨天"]) 可以随机从列表中选取一个元素
C. random.random() 返回一个 0 到 1 之间(不含 1)的随机浮点数
D. 调用 random.shuffle(list) 会返回一个新的打乱后的列表副本
✅ 正确答案:ABC
💡 考点解析:random 模块常用函数(randint、choice、random、shuffle是原地修改)
第 11 题 编程操作题 15 分

题目描述:
在丝绸之路的国际贸易中,商人需要了解不同货币之间的兑换关系。请你编写程序,使用字典建立一份货币兑换表,并实现查询和兑换功能。
已知基础货币为"开元通宝"(铜钱),兑换规则如下:
- 1 银两 = 1000 铜钱
- 1 金币 = 10000 铜钱
- 1 绢帛 = 200 铜钱
程序要求:
1. 用户首先输入一个整数 q,表示有 q 次查询。
2. 每次查询输入一行,格式为 货币名称 数量(如 银两 5)。
3. 程序输出对应的铜钱数量。
4. 如果输入的货币名称不在兑换表中,输出"未知货币"。

输入格式:
第一行:一个正整数 q,表示查询次数。
接下来 q 行:每行一个货币名称和一个正整数(数量),以空格分隔。

输出格式:
对每次查询,输出"X Y = Z铜钱"(X为数量,Y为货币名称,Z为换算后的铜钱数),或输出"未知货币"。

示例输入:

3
银两 3
金币 1
贝币 10

示例输出:

3 银两 = 3000铜钱
1 金币 = 10000铜钱
未知货币
✅ 参考答案:
📖 参考代码
rates = {
    "银两": 1000,
    "金币": 10000,
    "绢帛": 200,
    "铜钱": 1
}
q = int(input())
for _ in range(q):
    parts = input().split()
    name = parts[0]
    amount = int(parts[1])
    if name in rates:
        total = amount * rates[name]
        print(str(amount) + " " + name + " = " + str(total) + "铜钱")
    else:
        print("未知货币")
第 12 题 编程操作题 15 分

题目描述:
海上丝绸之路连接了多个重要港口。给定一个 n 个港口之间的距离矩阵(二维列表),请你编写程序实现以下功能:
1. 用户首先输入一个整数 n,表示港口数量。
2. 接下来输入 n 行,每行 n 个整数(以空格分隔),表示港口之间的距离矩阵。矩阵中 dist[i][j] 表示从港口 i+1 到港口 j+1 的距离(里)。矩阵是对称的,对角线为0。
3. 程序输出每对港口之间的距离摘要:对于每对不同的港口(i, j),如果 dist[i][j] 不为0,则按以下格式输出:
港口i+1 -> 港口j+1:XX里
4. 输出顺序:按 i 从小到大,对每个 i 按 j 从小到大。

输入格式:
第一行:一个正整数 n。
接下来 n 行:每行 n 个整数,以空格分隔。

输出格式:
每行一个距离记录,格式见题目描述。不输出距离为0的记录(包括对角线)。

示例输入:

3
0 800 1200
800 0 500
1200 500 0

示例输出:

港口1 -> 港口2:800里
港口1 -> 港口3:1200里
港口2 -> 港口3:500里
✅ 参考答案:
📖 参考代码
n = int(input())
dist = []
for _ in range(n):
    row = list(map(int, input().split()))
    dist.append(row)
for i in range(n):
    for j in range(i + 1, n):
        if dist[i][j] != 0:
            print("港口" + str(i + 1) + " -> 港口" + str(j + 1) + ":" + str(dist[i][j]) + "里")
第 13 题 编程操作题 20 分

题目描述:
海上丝绸之路的商船需要将货物装入标准化的货箱。每个货箱的容量为 C(单位:斤)。给定 n 件货物的重量列表(单位:斤),商人希望用最少的货箱装完所有货物,但有一个特殊规则:每件货物必须完整装入一个箱子,不能拆分,且装入箱子时按货物给出的顺序依次装载——当一个箱子装不下当前货物时,就用一个新箱子来装。
请你编写程序,模拟这个装箱过程,计算需要多少个货箱。

输入格式:
第一行:一个正整数 C,表示每个货箱的容量(斤)。
第二行:一个正整数 n,表示货物的件数。
第三行:n 个正整数,以空格分隔,依次表示每件货物的重量(斤)。

输出格式:
第一行:使用货箱数量:X个
接下来 X 行,每行输出一个货箱中装入的货物重量列表,格式为 货箱Y:[重量列表](货箱编号从1开始)。

示例输入:

10
6
5 3 8 2 6 1

示例输出:

使用货箱数量:4个
货箱1:[5, 3]
货箱2:[8, 2]
货箱3:[6, 1]
货箱4:[6]
(解释:货箱1装5+3=8(剩余2不够装8),开货箱2装8+2=10(满),开货箱3装6+1=7(剩余3不够装6),开货箱4装6。)
✅ 参考答案:
📖 参考代码
C = int(input())
n = int(input())
weights = list(map(int, input().split()))
boxes = []
current_box = []
current_load = 0
for w in weights:
    if w > C:
        # 单件货物超过容量,单独装箱
        if current_box:
            boxes.append(current_box)
        boxes.append([w])
        current_box = []
        current_load = 0
    elif current_load + w <= C:
        current_box.append(w)
        current_load += w
    else:
        boxes.append(current_box)
        current_box = [w]
        current_load = w
if current_box:
    boxes.append(current_box)
print("使用货箱数量:" + str(len(boxes)) + "个")
for i in range(len(boxes)):
    print("货箱" + str(i + 1) + ":" + str(boxes[i]))
第 14 题 编程操作题 20 分

题目描述:
考古学家在丝绸之路遗址中发现了若干件文物,每件文物有名称和年代(公元年份,负数表示公元前)。请你编写程序,对这些文物进行排序和筛选。
程序要求:
1. 用户首先输入一个整数 n,表示文物数量。
2. 接下来输入 n 行,每行格式为 文物名称 年代(名称和年代以空格分隔,年代为整数)。
3. 程序将所有文物数据存入一个列表中。
4. 按年代从小到大(从古到今)排序后,输出所有文物的信息。
5. 筛选并输出所有公元后的文物(年代 > 0),按名称的字母顺序(Python默认字符串排序即可)输出。

输入格式:
第一行:一个正整数 n。
接下来 n 行:每行一个文物名称和一个整数年代,以空格分隔。

输出格式:
首先输出 ===按年代排序(从古到今)===,然后每行输出 名称(年代年)。
然后输出 ===公元后文物(按名称排序)===,然后每行输出 名称(年代年)。

示例输入:

5
青铜剑 -200
丝绸残片 150
陶罐 -500
铜镜 300
竹简 50

示例输出:

===按年代排序(从古到今)===
陶罐(-500年)
青铜剑(-200年)
竹简(50年)
丝绸残片(150年)
铜镜(300年)
===公元后文物(按名称排序)===
竹简(50年)
丝绸残片(150年)
铜镜(300年)
✅ 参考答案:
📖 参考代码
n = int(input())
artifacts = []
for _ in range(n):
    parts = input().split()
    name = parts[0]
    year = int(parts[1])
    artifacts.append((name, year))
# 按年代排序
sorted_by_year = sorted(artifacts, key=lambda x: x[1])
print("===按年代排序(从古到今)===")
for name, year in sorted_by_year:
    print(name + "(" + str(year) + "年)")
# 筛选公元后并按名称排序
after_ad = [(name, year) for name, year in artifacts if year > 0]
sorted_by_name = sorted(after_ad, key=lambda x: x[0])
print("===公元后文物(按名称排序)===")
for name, year in sorted_by_name:
    print(name + "(" + str(year) + "年)")