🔒 答案已锁定

📖 答案解析 — 星火征途(红色文化) — 中等

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

第 1 题 单选题 2 分
在"红色密码本"项目中,需要将一个用逗号分隔的英雄名字字符串拆分成列表。hero_str = "雷锋,董存瑞,黄继光,邱少云",使用以下哪个方法可以得到列表 ["雷锋", "董存瑞", "黄继光", "邱少云"]?
A. hero_str.slice(",")
B. hero_str.split(",")
C. hero_str.partition(",")
D. hero_str.join(",")
✅ 正确答案:B
💡 考点解析:字符串 split() 方法将字符串按指定分隔符拆分为列表
第 2 题 单选题 2 分
在革命根据地物资管理系统中,使用字典存储物资信息。supplies = {"粮食": 500, "弹药": 300, "药品": 100},以下哪个操作可以安全地获取"被服"的数量,如果键不存在则返回0?
A. supplies["被服"]
B. supplies.get("被服")
C. supplies.get("被服", 0)
D. supplies["被服"] or 0
✅ 正确答案:C
💡 考点解析:字典的 get() 方法,第二个参数为键不存在时的默认值
第 3 题 单选题 2 分
以下是一个计算"红军长征中翻越雪山所需物资"的函数,关于该函数的说法,正确的是?
def calc_supplies(people, days):
    food = people * 2 * days
    medicine = people * 0.5 * days
    return food, medicine
f, m = calc_supplies(100, 30)
print(f, m)
A. 函数 calc_supplies 没有返回值
B. 该函数可以返回多个值,实际上是以元组形式返回
C. f, m = calc_supplies(100, 30) 这种写法是错误的
D. 函数中的 food 和 medicine 是全局变量
✅ 正确答案:B
💡 考点解析:函数可以返回多个值(封装为元组),且可以用多个变量接收
第 4 题 单选题 2 分
在"革命日记档案"系统中,需要读取一个文件的内容。以下关于文件操作的描述,正确的是?
A. open("diary.txt", "r") 以写入模式打开文件
B. open("diary.txt", "w") 如果文件不存在会报错
C. open("diary.txt", "a") 以追加模式打开文件,写入内容会添加到文件末尾
D. 使用 open() 打开文件后,不需要关闭文件
✅ 正确答案:C
💡 考点解析:文件打开模式——"r"读取、"w"写入(覆盖)、"a"追加;open()后需关闭或使用with语句
第 5 题 单选题 2 分
在情报解码程序中,输入的数据可能包含非数字字符,需要做异常处理。以下代码的输出结果是什么?
data = ["100", "200", "abc", "300"]
total = 0
for d in data:
    try:
        total += int(d)
    except ValueError:
        print("发现无法识别的数据:" + d)
print("有效数据总和:" + str(total))
A. 有效数据总和:600
B. 发现无法识别的数据:abc
C. 程序报错并终止
D. 发现无法识别的数据:abc
✅ 正确答案:B
💡 考点解析:try-except 异常处理——捕获 ValueError 后继续执行后续循环,不中断程序
第 6 题 多选题 4 分
在"红色标语格式化"任务中,需要使用字符串格式化输出。以下Python代码中,哪些可以正确输出"红军长征走了25000里"?
A. print("红军长征走了%d里" % 25000)
B. print("红军长征走了{}里".format(25000))
C. print(f"红军长征走了{25000}里")
D. print("红军长征走了" + 25000 + "里")
✅ 正确答案:ABC
💡 考点解析:字符串格式化——%格式化、format()方法、f-string;D选项类型错误,不能直接拼接整数
第 7 题 多选题 4 分
有一个列表 battles = ["湘江战役", "遵义会议", "四渡赤水", "飞夺泸定桥", "爬雪山", "过草地", "会宁会师"],以下操作描述正确的有哪些?
A. battles[0:3] 返回 ["湘江战役", "遵义会议", "四渡赤水"]
B. battles[-1] 返回 "会宁会师"
C. battles[::-1] 可以反转整个列表
D. for battle in battles: 可以依次遍历列表中的每个元素
✅ 正确答案:ABCD
💡 考点解析:列表切片、负索引、步长为-1的反转、for-in遍历列表
第 8 题 多选题 4 分
以下字典 hero_info = {"姓名": "董存瑞", "年龄": 19, "籍贯": "河北怀来", "事迹": "舍身炸碉堡"},关于字典遍历的说法,正确的有哪些?
A. for key in hero_info: 遍历的是字典的键
B. for value in hero_info.values(): 遍历的是字典的值
C. for key, value in hero_info.items(): 可以同时遍历键和值
D. for item in hero_info: 遍历的是字典的值
✅ 正确答案:ABC
💡 考点解析:字典遍历——默认遍历键、values()遍历值、items()遍历键值对
第 9 题 多选题 4 分
关于Python中元组(tuple)和集合(set)的说法,正确的有哪些?
A. 元组是不可变的,创建后不能修改其中的元素
B. 集合中的元素是无序且不重复的
C. 元组可以用作字典的键,因为它是不可变的
D. {1, 2, 2, 3} 创建的集合包含4个元素
✅ 正确答案:ABC
💡 考点解析:元组的不可变性、集合的无序去重特性、字典键不可变原则;D选项集合自动去重,实际只有3个元素
第 10 题 多选题 4 分
关于Python中全局变量和局部变量的说法,正确的有哪些?
A. 在函数内部定义的变量默认为局部变量,只能在函数内部使用
B. 在函数外部定义的变量默认为全局变量,函数内部可以直接读取
C. 如果要在函数内部修改全局变量,需要使用 global 关键字声明
D. 函数内部可以直接修改全局列表的元素,因为列表是可变类型
✅ 正确答案:ABCD
💡 考点解析:局部变量与全局变量的作用域,global关键字,可变类型(如列表)在函数内部修改元素不需要global声明
第 11 题 编程操作题 15 分

题目描述:
在革命战争年代,红军情报员使用简化的摩斯密码传递消息。现有一个摩斯密码对照表(只包含字母和数字),请你编写程序,输入一段摩斯密码(每个密码用空格分隔),翻译成明文。
摩斯密码对照表如下(已内置在代码中):
- A: .- B: -... C: -.-. D: -.. E: .
- F: ..-. G: --. H: .... I: .. J: .---
- K: -.- L: .-.. M: -- N: -. O: ---
- P: .--. Q: --.- R: .-. S: ... T: -
- U: ..- V: ...- W: .-- X: -..- Y: -.-- Z: --..
- 0: ----- 1: .---- 2: ..--- 3: ...-- 4: ....-
- 5: ..... 6: -.... 7: --... 8: ---.. 9: ----.

输入格式:
一行字符串,由摩斯密码组成,每个密码之间用空格分隔。

输出格式:
一行,翻译后的明文字符串。

示例输入:

.... . .-.. .-.. --- .-- --- .-. .-.. -..

示例输出:

HELLO WORLD
说明:连续两个空格代表单词之间的分隔(输出时保留为一个空格)。
✅ 参考答案:
📖 参考代码
# 摩斯密码对照表
morse_dict = {
    ".-": "A", "-...": "B", "-.-.": "C", "-..": "D", ".": "E",
    "..-.": "F", "--.": "G", "....": "H", "..": "I", ".---": "J",
    "-.-": "K", ".-..": "L", "--": "M", "-.": "N", "---": "O",
    ".--.": "P", "--.-": "Q", ".-.": "R", "...": "S", "-": "T",
    "..-": "U", "...-": "V", ".--": "W", "-..-": "X", "-.--": "Y", "--..": "Z",
    "-----": "0", ".----": "1", "..---": "2", "...--": "3", "....-": "4",
    ".....": "5", "-....": "6", "--...": "7", "---..": "8", "----.": "9"
}
# 输入摩斯密码,按空格分割
codes = input().split(" ")
result = ""
for code in codes:
    if code == "":
        # 连续空格表示单词分隔
        if result != "" and result[-1] != " ":
            result += " "
    elif code in morse_dict:
        result += morse_dict[code]
print(result)
第 12 题 编程操作题 15 分

题目描述:
红军后勤部需要管理多个仓库的物资库存。初始有三个仓库,每个仓库存储不同的物资及其数量。请你编写程序,实现以下功能:
1. 输入一个仓库名称,查询该仓库的所有物资
2. 如果仓库不存在,输出"未找到该仓库"
3. 如果仓库存在,按物资名称排序后逐行输出(格式:"物资名:数量")

输入格式:
第一行一个字符串,表示要查询的仓库名称。

输出格式:
如果仓库存在,每行输出一个物资信息,格式为"物资名:数量"(按物资名从小到大排序,即按照字符串默认排序)。
如果仓库不存在,输出"未找到该仓库"。
示例输入1:
一号仓库
示例输出1:
手榴弹:200
步枪:150
粮食:500
示例输入2:
五号仓库
示例输出2:
未找到该仓库

示例输入:

示例输出:

✅ 参考答案:
📖 参考代码
# 初始化仓库数据
warehouses = {
    "一号仓库": {"粮食": 500, "步枪": 150, "手榴弹": 200},
    "二号仓库": {"药品": 100, "绷带": 300, "粮食": 400},
    "三号仓库": {"弹药": 1000, "步枪": 80, "被服": 200}
}
name = input()
if name in warehouses:
    # 获取该仓库的物资,按物资名排序
    supplies = warehouses[name]
    sorted_keys = sorted(supplies.keys())
    for key in sorted_keys:
        print(key + ":" + str(supplies[key]))
else:
    print("未找到该仓库")
第 13 题 编程操作题 20 分

题目描述:
有一份革命战役日志文件 battle_log.txt,每行记录了一场战役的信息,格式为"战役名称,日期,参战人数,结果(胜/负/平)"。请你编写程序,读取该文件,完成以下分析任务:
1. 统计总共的战役数量
2. 统计获胜的战役数量
3. 找出参战人数最多的一场战役,输出其名称和参战人数
4. 计算胜率(获胜战役数 / 总战役数,以百分比表示,保留1位小数)
假设文件内容如下(你可以直接构造这个字符串列表模拟文件读取):
湘江战役,1934-11-27,86000,胜
四渡赤水,1935-01-19,30000,胜
飞夺泸定桥,1935-05-29,22,胜
平型关大捷,1937-09-25,12000,胜
百团大战,1940-08-20,200000,胜

输入格式:
无输入(直接处理内置的战役数据)。

输出格式:
第一行输出"总战役数:X"
第二行输出"获胜战役数:Y"
第三行输出"最大规模战役:Z战役,参战人数N人"
第四行输出"胜率:P%"

示例输入:

示例输出:

总战役数:5
获胜战役数:5
最大规模战役:百团大战,参战人数200000人
胜率:100.0%
✅ 参考答案:
📖 参考代码
# 模拟日志文件内容(实际考试中考生可用同样方式构造数据)
battle_data = [
    "湘江战役,1934-11-27,86000,胜",
    "四渡赤水,1935-01-19,30000,胜",
    "飞夺泸定桥,1935-05-29,22,胜",
    "平型关大捷,1937-09-25,12000,胜",
    "百团大战,1940-08-20,200000,胜"
]
total = 0
win_count = 0
max_people = 0
max_battle = ""
for line in battle_data:
    parts = line.split(",")
    name = parts[0]
    people = int(parts[2])
    result = parts[3]
    total += 1
    if result == "胜":
        win_count += 1
    if people > max_people:
        max_people = people
        max_battle = name
win_rate = win_count / total * 100
print("总战役数:" + str(total))
print("获胜战役数:" + str(win_count))
print("最大规模战役:" + max_battle + ",参战人数" + str(max_people) + "人")
print("胜率:" + str(round(win_rate, 1)) + "%")
第 14 题 编程操作题 20 分

题目描述:
某学校组织学生参观多个红色地标,每个地标的参观需要一定时间(分钟)。学校规定总参观时间不能超过T分钟。请你编写程序,输入各个地标的名称和参观时间,以及总时间限制T,找出在不超过时间限制的情况下,能参观最多地标的方案,输出地标数量和名称列表。
提示:采用贪心策略——优先选择参观时间短的地标,可以参观更多地点。

输入格式:
第一行两个整数 n 和 T,分别表示地标数量和总时间限制(分钟),用空格分隔。
接下来 n 行,每行一个地标名称和一个整数时间(分钟),用空格分隔。

输出格式:
第一行输出"可参观地标数:X个"
第二行输出参观的地标名称列表,用"→"箭头连接,表示参观顺序。

示例输入:

5 180
延安革命纪念馆 60
井冈山博物馆 45
遵义会议会址 50
西柏坡纪念馆 55
南湖红船 30

示例输出:

可参观地标数:4个
南湖红船→井冈山博物馆→遵义会议会址→西柏坡纪念馆
✅ 参考答案:
📖 参考代码
# 输入地标数量和总时间限制
line = input().split()
n = int(line[0])
T = int(line[1])
# 存储地标信息
sites = []
for i in range(n):
    parts = input().split()
    name = parts[0]
    time_cost = int(parts[1])
    sites.append((name, time_cost))
# 按参观时间从小到大排序(贪心策略)
for i in range(len(sites)):
    for j in range(i + 1, len(sites)):
        if sites[i][1] > sites[j][1]:
            sites[i], sites[j] = sites[j], sites[i]
# 贪心选择
selected = []
total_time = 0
for site in sites:
    name = site[0]
    time_cost = site[1]
    if total_time + time_cost <= T:
        selected.append(name)
        total_time += time_cost
    else:
        break
# 输出结果
print("可参观地标数:" + str(len(selected)) + "个")
print("→".join(selected))