🔒 答案已锁定

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

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

第 1 题 单选题 2 分
在统计"红军各部队番号"时,需要生成一个包含1到10所有整数的列表。以下使用列表推导式的代码,哪个可以正确生成 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]?
A. [x for x in range(10)]
B. [x for x in range(1, 11)]
C. [x for x in range(1, 10)]
D. {x for x in range(1, 11)}
✅ 正确答案:B
💡 考点解析:列表推导式——[表达式 for 变量 in 可迭代对象],range(1, 11)生成1到10
第 2 题 单选题 2 分
在"情报加密模块"中,需要对每个字符的ASCII码进行简单变换。以下使用lambda匿名函数定义变换规则,输出结果是什么?
encode = lambda x: (x + 3) % 26
result = encode(24)
print(result)
A. 27
B. 1
C. 24
D. 0
✅ 正确答案:B
💡 考点解析:lambda匿名函数——lambda 参数: 表达式,(24+3)%26 = 27%26 = 1
第 3 题 单选题 2 分
在"革命根据地面积计算"中,需要使用数学函数来处理。以下关于Python math 模块的说法,正确的是?
A. math.sqrt(16) 返回 4.0,用于计算平方根
B. math.ceil(3.14) 返回 3,用于向下取整
C. math.fabs(-5) 返回 -5,用于取绝对值
D. math.pow(2, 3) 返回 6,用于计算幂
✅ 正确答案:A
💡 考点解析:math模块——sqrt()平方根、ceil()向上取整、floor()向下取整、fabs()绝对值、pow()幂运算
第 4 题 单选题 2 分
在统计"革命标语使用频率"的任务中,有一个列表slogans = ["奋斗", "前进", "奋斗", "胜利", "奋斗"],想知道"奋斗"出现了几次,以下哪个代码正确?
A. slogans.count("奋斗"),结果为 3
B. slogans.find("奋斗"),结果为 3
C. slogans.index("奋斗"),结果为 3
D. slogans.sum("奋斗"),结果为 3
✅ 正确答案:A
💡 考点解析:列表的count()方法——统计某个元素在列表中出现的次数
第 5 题 单选题 2 分
在"红色地标带编号展示"程序中,需要同时获取每个地标的序号和名称。以下代码的输出是什么?
landmarks = ["井冈山", "延安", "西柏坡", "遵义"]
for i, name in enumerate(landmarks):
    print(str(i + 1) + "." + name)
A. 输出 0.井冈山 换行 1.延安 换行 2.西柏坡 换行 3.遵义
B. 输出 1.井冈山 换行 2.延安 换行 3.西柏坡 换行 4.遵义
C. 输出 (0, '井冈山') 换行 (1, '延安') 换行 ...
D. 程序报错
✅ 正确答案:B
💡 考点解析:enumerate()函数——同时获取索引和值,索引默认从0开始,i+1使其从1开始
第 6 题 多选题 4 分
在"革命情报验证"程序中,需要判断字符串的组成。以下关于字符串判断方法的说法,正确的有哪些?
A. "1937".isdigit() 返回 True,判断字符串是否全部由数字组成
B. "Hero".isalpha() 返回 True,判断字符串是否全部由字母组成
C. "Hello123".isalnum() 返回 True,判断字符串是否只包含字母和数字
D. "延安1935".startswith("延安") 返回 True,判断是否以指定前缀开头
✅ 正确答案:ABCD
💡 考点解析:字符串判断方法——isdigit()、isalpha()、isalnum()、startswith()、endswith()
第 7 题 多选题 4 分
在"革命根据地数据库"中,使用字典存储了大量信息。以下关于字典操作的说法,正确的有哪些?
A. data["新根据点"] = "晋察冀" 可以向字典添加新的键值对
B. data.pop("旧根据点") 可以删除指定键并返回其值
C. data.update({"根据地A": 100, "根据地B": 200}) 可以批量更新/添加键值对
D. "根据地" in data 可以判断某个键是否存在于字典中
✅ 正确答案:ABCD
💡 考点解析:字典操作——直接赋值添加、pop()删除、update()批量更新、in判断键是否存在
第 8 题 多选题 4 分
在"战役档案管理"系统中,需要对文件进行读写。以下关于文件操作的说法,正确的有哪些?
A. f.readlines() 会读取文件所有行,返回一个列表,每行作为一个字符串元素
B. f.writelines(list) 可以将一个字符串列表逐行写入文件
C. 使用 with open("file.txt", "r") as f: 可以自动关闭文件,无需手动调用f.close()
D. f.readline() 每次读取文件的一行,包括行末的换行符
✅ 正确答案:ABCD
💡 考点解析:文件操作进阶——readlines()、writelines()、with语句自动管理、readline()逐行读取
第 9 题 多选题 4 分
在"英雄战绩排行榜"中,需要对列表中的字典按某个字段排序。以下关于排序的说法,正确的有哪些?
A. sorted(heroes, key=lambda h: h["战绩"]) 可以按"战绩"字段的值排序
B. list.sort(reverse=True) 可以实现降序排序
C. list.sort(key=len) 可以按元素的长度进行排序
D. sorted() 函数会修改原列表,sort() 方法不会修改原列表
✅ 正确答案:ABC
💡 考点解析:排序——sorted()和sort()都支持key和reverse参数;D选项错误,sort()修改原列表而sorted()不修改
第 10 题 多选题 4 分
在"军需物资调配"函数设计中,需要考虑不同情况的参数处理。以下关于函数参数的说法,正确的有哪些?
A. def func(a, b=10): 中b是默认参数,调用时可以不传b的值
B. def func(*args): 中的*args可以接收任意数量的位置参数,组装成元组
C. def func(kwargs): 中的kwargs可以接收任意数量的关键字参数,组装成字典
D. 默认参数的值必须是不可变类型,如整数、字符串、元组等
✅ 正确答案:ABC
💡 考点解析:函数参数——默认参数、可变位置参数*args、可变关键字参数**kwargs;D选项不完全正确,默认参数可以用可变类型但不推荐
第 11 题 编程操作题 15 分

题目描述:
红军情报站收到一批情报,每条情报是一个字符串。情报的校验规则如下:
1. 长度必须在6到12个字符之间(含)
2. 必须同时包含字母和数字
3. 不能包含空格
请你编写程序,输入一条情报字符串,判断其是否合法。如果合法输出"情报合法",否则输出"情报不合法"。

输入格式:
一行字符串,表示情报内容。

输出格式:
一行,"情报合法"或"情报不合法"。
示例输入1:
RedArmy1936
示例输出1:
情报合法
示例输入2:
abc123
示例输出2:
情报合法
示例输入3:
ab12
示例输出3:
情报不合法

示例输入:

示例输出:

✅ 参考答案:
📖 参考代码
info = input()
# 检查长度
if len(info) < 6 or len(info) > 12:
    print("情报不合法")
else:
    has_letter = False
    has_digit = False
    has_space = False
    for ch in info:
        if ch == " ":
            has_space = True
        if ch.isalpha():
            has_letter = True
        if ch.isdigit():
            has_digit = True
    if has_space or not has_letter or not has_digit:
        print("情报不合法")
    else:
        print("情报合法")
第 12 题 编程操作题 15 分

题目描述:
红军后勤部有若干种物资,每种物资有固定的数量。前线需要一定数量的物资补给,请你判断现有的物资总量是否满足前线需求,以及还需要补充多少或剩余多少。

输入格式:
第一行一个整数 n(1 ≤ n ≤ 20),表示物资种类数。
接下来 n 行,每行一个物资名称和一个整数数量,用空格分隔。
最后一行一个整数 demand,表示前线的总需求量。

输出格式:
如果物资总量 ≥ 需求量,输出"物资充足,剩余X单位"(X为剩余量)。
如果物资总量 < 需求量,输出"物资不足,缺少X单位"(X为缺少量)。
示例输入1:
4
粮食 500
弹药 300
药品 100
被服 200
900
示例输出1:
物资充足,剩余200单位
示例输入2:
3
粮食 200
弹药 150
药品 80
500
示例输出2:
物资不足,缺少70单位

示例输入:

示例输出:

✅ 参考答案:
📖 参考代码
n = int(input())
total = 0
for i in range(n):
    line = input().split()
    quantity = int(line[1])
    total += quantity
demand = int(input())
if total >= demand:
    print("物资充足,剩余" + str(total - demand) + "单位")
else:
    print("物资不足,缺少" + str(demand - total) + "单位")
第 13 题 编程操作题 20 分

题目描述:
红军某部队的行军日志记录了每天的行军信息,格式为"日期,出发地,目的地,行军里程,天气"。请你编写程序,处理这些日志数据,完成以下统计:
1. 计算总行军里程
2. 找出行军里程最长的一天的所有信息
3. 统计每种天气出现的天数
日志数据(已内置在代码中):
1934-10-16,瑞金,于都,90,晴
1934-10-17,于都,信丰,85,晴
1934-10-18,信丰,大余,75,阴
1934-10-19,大余,南雄,100,晴
1934-10-20,南雄,仁化,60,雨

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

输出格式:
第一行输出"总行军里程:X里"
第二行输出"最长行军日:日期,出发地→目的地,里程里,天气"
之后输出"天气统计:",每行格式为"天气名:X天",按天气名字典序升序排列。

示例输入:

示例输出:

总行军里程:410里
最长行军日:1934-10-19,大余→南雄,100里,晴
天气统计:
晴:3天
阴:1天
雨:1天
✅ 参考答案:
📖 参考代码
# 行军日志数据
log_data = [
    "1934-10-16,瑞金,于都,90,晴",
    "1934-10-17,于都,信丰,85,晴",
    "1934-10-18,信丰,大余,75,阴",
    "1934-10-19,大余,南雄,100,晴",
    "1934-10-20,南雄,仁化,60,雨"
]
total_distance = 0
max_distance = 0
max_day_info = ""
weather_count = {}
for line in log_data:
    parts = line.split(",")
    date = parts[0]
    start = parts[1]
    end = parts[2]
    distance = int(parts[3])
    weather = parts[4]
    total_distance += distance
    if distance > max_distance:
        max_distance = distance
        max_day_info = date + "," + start + "→" + end + "," + str(distance) + "里," + weather
    if weather in weather_count:
        weather_count[weather] += 1
    else:
        weather_count[weather] = 1
print("总行军里程:" + str(total_distance) + "里")
print("最长行军日:" + max_day_info)
print("天气统计:")
# 按天气名排序输出
for weather in sorted(weather_count.keys()):
    print(weather + ":" + str(weather_count[weather]) + "天")
第 14 题 编程操作题 20 分

题目描述:
某红色旅游区有n个地标,每个地标有名称和参观所需时间(分钟)。游客有T分钟的总时间,希望参观尽量多的地标。请你编写程序,采用贪心策略(优先选择参观时间最短的地标),计算最多能参观多少个地标,并输出参观方案。

输入格式:
第一行两个整数 n 和 T(1 ≤ n ≤ 100,1 ≤ T ≤ 1000),用空格分隔。
接下来 n 行,每行一个地标名称和一个整数时间(分钟),用空格分隔。

输出格式:
第一行输出"最多可参观:X个地标"
第二行输出参观路线(地标名之间用"→"连接)

示例输入:

6 200
瑞金革命旧址 50
井冈山革命博物馆 45
遵义会议纪念馆 40
延安革命纪念馆 55
西柏坡纪念馆 35
天安门广场 30

示例输出:

最多可参观:5个地标
天安门广场→西柏坡纪念馆→遵义会议纪念馆→井冈山革命博物馆→瑞金革命旧址
✅ 参考答案:
📖 参考代码
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)):
    min_idx = i
    for j in range(i + 1, len(sites)):
        if sites[j][1] < sites[min_idx][1]:
            min_idx = j
    sites[i], sites[min_idx] = sites[min_idx], sites[i]
# 贪心选择
selected = []
total_time = 0
for site in sites:
    if total_time + site[1] <= T:
        selected.append(site[0])
        total_time += site[1]
    else:
        break
print("最多可参观:" + str(len(selected)) + "个地标")
print("→".join(selected))