智码云端官网|言若金叶

青少年编程教师认证-题库(专家级)

专家级初级题库 专级级高级题库 在线练习

专 家 级 初 级 题 库共12题)❀ 返回最前

试题1:扩展智能收银系统

【题目描述】

商店实行分级折扣政策,需要开发一个扩展版智能收银系统。该系统需要处理三种商品(书本、文具、书包),根据订单总价自动计算折扣,并准确计算找零金额。

【题目要求】

  1. 输入三个浮点数,分别代表书本价格、文具价格和书包价格
  2. 计算订单总价,应用以下折扣规则:
    • 若总价 > 100元,实付金额 = 总价 × 0.9
    • 若总价 ≤ 100元,实付金额 = 总价
  3. 输入用户支付金额(浮点数)
  4. 输出以下信息,所有金额保留两位小数:
    • 商品总价
    • 实付金额(应用折扣后)
    • 支付金额
    • 找零金额
  5. 要求使用条件判断语句实现折扣计算

【输出示例】

书本价格:45.5
文具价格:32.0
书包价格:38.0
收取金额:150.0

商品总价:115.50元
实付金额:103.95元
找零:46.05元

试题2:家庭成员急救决策树

【题目描述】

开发一个家庭成员急救决策系统,根据伤情类型、疼痛等级和医院距离,智能提供急救处理建议,帮助家庭在紧急情况下做出正确决策。

【题目要求】

  1. 输入三个参数:
    • 伤情类型(字符串,可选”擦伤”、”骨折”、”烧伤”)
    • 疼痛等级(整数,1-10分)
    • 最近医院距离(浮点数,单位:公里)
  2. 根据以下决策逻辑输出处理建议:
    • 如果是擦伤:
      • 疼痛等级 < 3 → “在家碘伏消毒,创可贴处理”
      • 否则 → “建议破伤风疫苗备案”
    • 如果是骨折:
      • 先输出:”勿移动伤者,用硬板固定”
      • 疼痛等级 > 6 → “优先联系骨科医院”
      • 否则 → “社区医院包扎”
    • 如果是烧伤:
      • 先输出:”立即冷水冲洗15分钟!”
      • 医院距离 > 5公里 → “同步呼叫120急救”
  3. 确保逻辑分支完整,无遗漏情况

【输出示例】

输入示例1:

伤情类型:擦伤
疼痛等级:1
最近医院距离:10

伤情类型(擦伤/骨折/烧伤):擦伤
疼痛等级(1-10):1
最近医院距离(公里):10

在家碘伏消毒,创可贴处理

输入示例2:

伤情类型:骨折
疼痛等级:8
最近医院距离:10

伤情类型(擦伤/骨折/烧伤):骨折
疼痛等级(1-10):8
最近医院距离(公里):10

勿移动伤者,用硬板固定
优先联系骨科医院

输入示例3:

伤情类型:烧伤
疼痛等级:8
最近医院距离:10

伤情类型(擦伤/骨折/烧伤):烧伤
疼痛等级(1-10):8
最近医院距离(公里):10

立即冷水冲洗15分钟!
同步呼叫120急救

试题3:年龄自适应BMI健康评估系统

【题目描述】

根据世界卫生组织标准,BMI指数在不同年龄段应有差异化解读。请开发一个智能BMI评估程序,根据用户年龄自动切换青少年与成人健康标准,为健康管理提供精准建议。

【题目要求】

  1. 输入三个参数:
    • 年龄(整数)
    • 身高(米,浮点数,支持小数如1.75)
    • 体重(公斤,浮点数,支持小数如65.5)
  2. 计算BMI值,公式:BMI = 体重(kg) ÷ 身高(m)²,结果保留1位小数
  3. 根据年龄段应用不同健康标准:
    • 年龄 < 18岁(青少年标准):
      • BMI < 18 → “青少年偏瘦”
      • 18 ≤ BMI < 22 → “青少年正常”
      • BMI ≥ 22 → “青少年超重”
    • 年龄 ≥ 18岁(成人标准):
      • BMI < 18.5 → “偏瘦”
      • 18.5 ≤ BMI < 24 → “正常”
      • 24 ≤ BMI < 28 → “超重”
      • BMI ≥ 28 → “肥胖”
  4. 输出格式:”您的BMI是{值},属于【{状态}】”

【输出示例】

年龄:16
身高(m):1.68
体重(kg):45

您的BMI是15.9,属于【青少年偏瘦】

年龄:25
身高(m):1.75
体重(kg):80

您的BMI是26.1,属于【超重】

试题4:智能停车收费系统

【题目描述】

现代城市停车管理需根据车型差异和停车时长实现阶梯计价。请设计一个智能停车收费系统,支持短时免费、分时段累加、单日封顶等规则。

【题目要求】

  1. 输入两个参数:
    • 停车时长(浮点数,单位:小时,如6.5表示6小时30分钟)
    • 车型(字符串,可选”轿车”、”SUV”、”大巴”)
  2. 按照以下优先级规则计算费用:
    • 优先级1:时长 ≤ 0.5小时 → 输出”30分钟内免费”
    • 优先级2:车型为”大巴” → 输出”应缴费用:10.0元”(固定费率)
    • 优先级3:5小时 ≤ 时长 < 24小时 → 计算:5元 + (时长-5) × 0.5元
    • 优先级4:其他情况(≥24小时或异常值)→ 输出”单日封顶20元”
  3. 分时段计价结果保留1位小数
  4. 要求使用多分支条件判断结构

【输出示例】

输入:停车时长(小时):0.25  
车型(轿车/SUV/大巴):轿车
输出:30分钟内免费

输入:停车时长(小时):3
车型(轿车/SUV/大巴):大巴
输出:应缴费用:10.0元

输入:停车时长(小时):18
车型(轿车/SUV/大巴):SUV
输出:应缴费用:5 + (18-5)*0.5 = 11.5元

试题5:鸡兔同笼问题

【题目描述】

鸡兔同笼问题源自中国古代数学名著《孙子算经》,是经典的代数问题。请编写程序,通过穷举法或数学方程解决此问题,体验逻辑思维与代数方法的碰撞。

【题目要求】

  1. 输入两个整数:
    • 总头数(鸡和兔的总数量)
    • 总脚数(鸡和兔的总脚数)
  2. 通过计算求解:
    • 鸡的数量(每只鸡2只脚,1个头)
    • 兔的数量(每只兔4只脚,1个头)
  3. 输出鸡和兔各自的数量
  4. 要求至少使用一种循环结构实现
  5. 注意处理无解情况

【输出示例】

请输入总头数:35
请输入总脚数:94

鸡有23只,兔有12只

试题6:级数求和(国际信息学奥赛风格)

【题目描述】

计算1! + 2! + … + n!的末6位数字。这是一个经典的大数计算优化问题,需要避免直接计算大阶乘,而是利用数学特性进行优化。

【题目要求】

  1. 输入一个正整数n(n < 30,保证计算可行性)
  2. 计算S = 1! + 2! + … + n!
  3. 输出S的末6位数字(不足6位则输出实际位数)
  4. 要求:
    • 避免大数计算溢出
    • 利用阶乘性质优化计算
    • 解释为什么n>25时结果不再变化
  5. 输出格式:”1!+2!+…+n!的末6位是:{结果}”

【输出示例】

请输入n值:10

计算到 1!→ 当前总和:000001
计算到 2!→ 当前总和:000003
计算到 3!→ 当前总和:000009
计算到 4!→ 当前总和:000033
计算到 5!→ 当前总和:000153
计算到 6!→ 当前总和:000873
计算到 7!→ 当前总和:005913
计算到 8!→ 当前总和:046233
计算到 9!→ 当前总和:409113
计算到 10!→ 当前总和:037913

最终结果:037913

试题7:杨辉三角形

【题目描述】

杨辉三角形是二项式系数在三角形中的一种几何排列,在中国南宋数学家杨辉1261年所著的《详解九章算法》中出现。请编写程序生成指定行数的杨辉三角形。

【题目要求】

  1. 输入一个正整数n,表示要生成的杨辉三角形的行数
  2. 生成并输出前n行杨辉三角形,要求:
    • 每行数字对称排列
    • 数字间有适当空格保持格式整齐
    • 每行数字数量等于行号
  3. 杨辉三角形的生成规则:
    • 第1行:1
    • 第n行第1个和最后1个数字为1
    • 其他数字 = 上一行同列数字 + 上一行前一列数字
  4. 输出格式应美观易读

【输出示例】

请输入行数:5

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1

试题8:数据加密系统

【题目描述】

设计一个高级数据加密系统,实现凯撒加密(字母位移)并增加随机干扰字符,使加密后的数据更难被破解。这是一个模拟信息安全的实践项目。

【题目要求】

  1. 输入一段英文文本(可包含字母、数字、空格和标点)
  2. 实现凯撒加密:
    • 对所有字母进行位移加密(如统一向后移3位:A→D, B→E, …, Z→C)
    • 非字母字符保持不变
    • 保持大小写一致性
  3. 添加随机干扰字符:
    • 在加密后的文本中随机位置插入干扰符号(如*#&!@)
    • 干扰字符数量约为原文长度的1/4
    • 干扰字符不影响解密
  4. 输出加密后的文本
  5. 可选:实现解密功能

【输出示例】

输入: "Hello World 123"  
加密(位移3 + 随机干扰)→ 输出: "Khoor*Zruog#123!"
解密(去除干扰 + 位移-3)→ 还原: "Hello World 123"

试题9:校园气象站数据分析

【题目描述】

学校新建了一个小型气象站,每天记录温度、湿度和天气状况。请开发一个数据分析程序,帮助同学们了解校园的气候变化规律。

【题目要求】

  1. 提供一周的气象数据(可预设或输入):
    • 每天包含:星期、温度(℃)、湿度(%)、天气状况
  2. 实现以下数据分析功能:
    • 计算一周的平均温度
    • 找出最高温和最低温及其出现日期
    • 统计不同天气状况出现的天数
    • 找出温差最大的一天
    • 计算舒适天气的天数(温度在20-26℃之间)
  3. 输出完整的分析报告,包括:
    • 基础统计结果
    • 天气状况统计
    • 温度变化分析
  4. 要求使用循环结构和条件判断

【题目说明】

  weather_data = {

    “周一”: {“温度”: 22, “湿度”: 65, “天气”: “晴”},

    “周二”: {“温度”: 25, “湿度”: 70, “天气”: “多云”},

    “周三”: {“温度”: 18, “湿度”: 80, “天气”: “雨”},

    “周四”: {“温度”: 20, “湿度”: 75, “天气”: “阴”},

    “周五”: {“温度”: 26, “湿度”: 60, “天气”: “晴”},

    “周六”: {“温度”: 24, “湿度”: 68, “天气”: “多云”},

    “周日”: {“温度”: 23, “湿度”: 72, “天气”: “晴”}

}

【输出示例】

=== 校园气象周报 ===

温度分析:
- 平均温度: 22.6℃
- 最高温度: 26℃(周五)
- 最低温度: 18℃(周三)

天气统计:
- 晴天: 3天
- 多云: 2天
- 雨天: 1天
- 阴天: 1天

温度变化图:
周一: 22℃ ******
周二: 25℃ ********
周三: 18℃ ****

试题10:校园智能储物柜管理系统

题目描述】

学校体育馆新引进了一套智能储物柜系统,需要开发管理程序实现学生物品的智能化存取管理。该系统将替代传统钥匙柜,通过学号验证保障物品安全。

题目要求】

  1. 系统初始状态:10个储物柜,全部空闲
  2. 实现以下功能菜单:
    • 存包:输入学号,分配空闲柜子,记录存放时间
    • 取包:输入学号和柜号,验证信息后取出物品
    • 查询:查看所有柜子状态(空闲/占用及学号)
    • 退出:结束程序
  3. 系统要求:
    • 每个柜子只能存放一个物品
    • 同一学号不能同时占用多个柜子
    • 操作记录日志(可选)
  4. 使用循环结构保持系统持续运行直到退出
  5. 界面友好,操作提示清晰

【输出示例】

=== 智能储物柜系统 ===

1. 存包 2. 取包 3. 查询 4. 退出
请选择操作:1
请输入学号:2023001
存入成功!柜号:3

当前储物柜状态:
柜1: 已占用
...
柜3: 已占用(学号2023001)
...
柜10: 空闲

专 家 级 高 级 题 库共30题)❀ 返回最前

试题1:拼图游戏中的“撤销”与“重做”

题目描述】
拼图游戏中,玩家可以移动拼图块改变游戏状态。请使用两个栈(撤销栈和重做栈)实现拼图状态的撤销(Undo)和重做(Redo)功能。初始状态为 A,依次进行以下操作:

  1. 移动拼图到新状态 A-B
  2. 移动拼图到新状态 A-B-C
  3. 移动拼图到新状态 A-B-C-D
  4. 撤销一次
  5. 撤销一次
  6. 重做一次
  7. 移动拼图到新状态 A-B-C-E
  8. 连续撤销直到无法撤销
  9. 连续重做到无法重做

每次操作后输出当前状态或相应提示。

题目要求
编写程序模拟上述过程,输出每一步后的结果。要求使用列表模拟栈,append() 压栈,pop() 弹栈。撤销时将当前状态压入重做栈,重做时从重做栈弹出并压回撤销栈。输出格式严格参照示例。

输出示例

当前拼图状态: A
移动拼图到新状态: A-B
移动拼图到新状态: A-B-C
移动拼图到新状态: A-B-C-D
撤销到状态: A-B-C
撤销到状态: A-B
重做到状态: A-B-C
移动拼图到新状态: A-B-C-E
撤销到状态: A-B-C
撤销到状态: A-B
撤销到状态: A
无法撤销,已经是最初状态
重做到状态: A-B
重做到状态: A-B-C
重做到状态: A-B-C-E
没有可重做的操作

试题2:班级值日生轮换表

题目描述
使用循环队列实现班级值日生的公平轮换。初始队列容量为5,依次添加值日生:小明、小红、小刚、小丽、小强。模拟以下过程:

  1. 尝试添加第6位同学小华(队列已满,应提示无法加入)。
  2. 显示当前值日生轮换顺序(从队首开始循环)。
  3. 模拟每周值日:每周开始时队首同学值日,然后该同学出队并重新入队(表示轮换到队尾),连续执行7周。
  4. 在第4周后,新加入两位同学小华、小敏(队列有空位)。
  5. 继续执行后续周次的值日。

要求输出每一步的关键信息。

题目要求
实现循环队列,使用列表和取模运算模拟。需包含入队、出队、判满、判空、显示队列等操作。输出格式参照示例。

输出示例

小明 已加入值日表
小红 已加入值日表
小刚 已加入值日表
小丽 已加入值日表
小强 已加入值日表
小华 无法加入,值日表已满!
当前值日生轮换顺序: 小明 → 小红 → 小刚 → 小丽 → 小强 → (循环)

第1周:
本周值日生是: 小明
当前值日生轮换顺序: 小红 → 小刚 → 小丽 → 小强 → (循环)

第2周:
本周值日生是: 小红
当前值日生轮换顺序: 小刚 → 小丽 → 小强 → (循环)

第3周:
本周值日生是: 小刚
当前值日生轮换顺序: 小丽 → 小强 → (循环)

第4周:
本周值日生是: 小丽
当前值日生轮换顺序: 小强 → (循环)
新同学加入:
小华 已加入值日表
小敏 已加入值日表
当前值日生轮换顺序: 小强 → 小华 → 小敏 → (循环)

第5周:
本周值日生是: 小强
当前值日生轮换顺序: 小华 → 小敏 → (循环)

第6周:
本周值日生是: 小华
当前值日生轮换顺序: 小敏 → (循环)

第7周:
本周值日生是: 小敏
当前值日生轮换顺序: (循环)

试题3:班级通讯录

题目描述
使用字典实现一个班级通讯录,键为学号(或姓名),值为包含姓名、电话、邮箱的字典。初始数据如下:

  • 张三:学号1,电话13800138001,邮箱zhangsan@school.com
  • 李四:学号2,电话13800138002,邮箱lisi@school.com
  • 王五:学号3,电话13800138003,邮箱wangwu@school.com

要求依次执行以下操作:

  1. 查找学生“李四”的信息并输出。
  2. 查找不存在的学生“赵六”。
  3. 更新学生“王五”的电话为13800555555。
  4. 尝试更新不存在的学生“赵六”的电话。
  5. 删除学生“李四”。
  6. 尝试删除不存在的学生“钱七”。
  7. 输出当前通讯录所有学生信息。
  8. 对比列表查找和字典查找的效率(查找“王五”时分别用列表遍历和字典直接访问,输出耗时)。

题目要求
实现通讯录类,包含增删改查方法。输出每一步操作的结果,并对比两种查找方式的耗时(可用 time 模块)。输出格式参照示例。

输出示例

已添加学生: 张三
已添加学生: 李四
已添加学生: 王五

查找测试:
找到学生 李四:
学号: 2
电话: 13800138002
邮箱: 李四@school.com
未找到学生: 赵六

更新测试:
已更新 王五 的电话
更新失败,未找到学生: 赵六

删除测试:
已删除学生: 李四
删除失败,未找到学生: 钱七

班级通讯录:
张三: 学号1, 电话13800138001
王五: 学号3, 电话13800555555
共 2 位同学

效率对比演示:
找到学生 王五:
学号: 3
电话: 13800555555
邮箱: 王五@school.com

列表查找耗时: 0.000002秒
字典查找耗时: 0.000055秒

试题4:好友关系网

题目描述
使用图(邻接表)表示班级同学的好友关系。同学名单:小明、小红、小刚、小丽、小强、小花。好友关系(双向)如下:

  • 小明-小红
  • 小明-小刚
  • 小红-小丽
  • 小刚-小强
  • 小丽-小花
  • 小强-小花

要求:

  1. 输出每个同学的好友列表。
  2. 判断小明和小红是否是朋友,小明和小丽是否是朋友。
  3. 找出小明的所有间接好友(朋友的朋友,不包括直接好友)。
  4. 找出小明的三级好友(朋友的朋友的朋友)。
  5. (可选)计算每个人的好友数量,找出“社交达人”。

题目要求
实现图结构,包含添加节点、添加边、获取邻居、广度优先遍历(BFS)等方法。按照上述要求输出结果。输出格式参照示例。

输出示例

全班同学的好友关系:
小明的好友: 小红, 小刚
小红的好友: 小明, 小丽
小刚的好友: 小明, 小强
小丽的好友: 小红, 小花
小强的好友: 小刚, 小花
小花的好友: 小丽, 小强
查询测试:
小明和小红是朋友吗? True
小明和小丽是朋友吗? False
查找间接好友(朋友的朋友):
小明的二级好友: ['小红', '小刚', '小丽', '小强']
查找三级好友(朋友的朋友的朋友):
小明的三级好友: ['小红', '小刚', '小丽', '小强', '小花']

试题5:课程优先级安排

题目描述
某些课程有先修要求,必须学完先修课才能学习后续课程。

给定以下课程依赖关系:

  • “高等数学” 需要先修 “数学基础”
  • “数据结构” 需要先修 “编程入门”
  • “算法分析” 需要先修 “数据结构”
  • “机器学习” 需要先修 “算法分析”

请使用拓扑排序算法输出一个合理的学习顺序。

题目要求
实现拓扑排序(Kahn算法或DFS),输出课程学习顺序。如果存在循环依赖则提示。输出格式参照示例。

输出示例

推荐的学习顺序:
1. 数学基础
2. 编程入门
3. 高等数学
4. 数据结构
5. 算法分析
6. 机器学习

试题6:迷宫游戏地图

题目描述
设计一个100×100的迷宫,只有少量墙壁(约10%),其余为可通行空地。要求使用稀疏矩阵(defaultdict)存储墙壁位置,以节省内存。初始玩家位置设为 (50,30)(坐标从0开始)。

要求:

  1. 生成一个随机迷宫(或给定固定墙壁集),墙壁用 # 表示,空地用 . 表示。
  2. 打印玩家周围10×10区域的地图(以玩家为中心截取)。
  3. 输出密集矩阵存储和稀疏矩阵存储所需的空间(元素个数)对比,并计算空间节省百分比。
  4. 查询玩家所在位置是否为墙壁,输出结果。

题目要求
实现稀疏矩阵存储,墙壁坐标作为键,值可设为 '#'。打印区域时,若坐标在稀疏矩阵中则输出 #,否则输出 .。输出格式参照示例。

输出示例

迷宫地图 (仅显示10×10区域,共100×100)
 .#########
 ....#.....
 ....... ...
 .......#...
 ...........
 .#...P.....
 ...........
 ...........#
 ...........
 ...........#
密集矩阵需要存储 10000 个格子
稀疏矩阵实际存储 853 个格子
节省了 91.47% 的空间
(50,30)是墙壁吗? False

试题7:手机通讯录联系人查找系统

题目描述
已排序的通讯录姓名列表如下:

["张三", "李四", "王五", "赵六", "张伟", "李娜", "王芳", "张丽", "李明", "王强"]

对应的电话号码字典为:

{"张三": "13800138000", 
"李四": "13900139000",
"王五": "13700137000",
"赵六": "13600136000",
"张伟": "13500135000",
"李娜": "13400134000",
"王芳": "13300133000",
"张丽": "13200132000",
"李明": "13100131000",
"王强": "13000130000"}

要求实现一个查找系统,支持:

  1. 精确查找:输入姓名,返回电话。
  2. 前缀查找:输入姓氏(如“张”),返回所有该姓氏的联系人及其电话。

程序应循环接收用户输入,输入 q 退出。

题目要求
使用二分查找实现精确查找,使用二分查找定位前缀范围实现前缀查找。输出每次查找的结果。输出格式参照示例。

输出示例

=== 通讯录查找演示 ===

请输入要查找的姓名或姓氏(输入q退出): 张三
找到联系人: 张三,电话: 13800138000

请输入要查找的姓名或姓氏(输入q退出): 张
找到3个姓氏为'张'的联系人:
张丽: 13200132000
张三: 13800138000
张伟: 13500135000

请输入要查找的姓名或姓氏(输入q退出): 李
找到3个姓氏为'李'的联系人:
李明: 13100131000
李娜: 13400134000
李四: 13900139000

请输入要查找的姓名或姓氏(输入q退出): 不存在的名字
未找到姓名包含'不存在的名字'的联系人

请输入要查找的姓名或姓氏(输入q退出): q
退出通讯录查找系统

试题8:超市水果价格排序

题目描述
给定5种水果的价格(元):

  • 苹果:5
  • 香蕉:3
  • 橙子:4
  • 葡萄:6
  • 梨子:2

请使用选择排序按价格从低到高排序,输出排序前和排序后的水果顺序。

题目要求
实现选择排序算法,输出排序前后的水果列表。输出格式参照示例。

输出示例

排序前的水果顺序:
苹果: 5元
香蕉: 3元
橙子: 4元
葡萄: 6元
梨子: 2元

排序后的水果顺序:
梨子: 2元
香蕉: 3元
橙子: 4元
苹果: 5元
葡萄: 6元

试题9:考试成绩分段统计

题目描述
使用计数排序对50个0-100的整数成绩进行排序,并统计各分数段人数。成绩由随机数生成(可固定随机种子确保可复现)。

分段规则:

  • 优秀:90-100
  • 良好:80-89
  • 中等:70-79
  • 及格:60-69
  • 不及格:0-59

要求:

  1. 输出原始成绩的前10个(示例)。
  2. 输出计数数组(每个分数的人数,仅显示出现过的分数)。
  3. 输出排序后的成绩列表的前10个。
  4. 输出各分数段人数统计。

题目要求
实现计数排序算法,计数数组大小为101。输出格式参照示例。

输出示例

原始成绩列表(前10个): [86, 52, 77, 80, 86, 50, 63, 79, 81, 67]

计数数组(分数:人数):
50分: 2人 | 52分: 4人 | 54分: 1人 | 58分: 3人 | 60分: 1人 | 61分: 1人 | 62分: 1人 | 63分: 1人 | 65分: 3人 | 66分: 1人 | 67分: 1人 | 68分: 1人 | 69分: 2人 | 70分: 1人 | 72分: 1人 | 73分: 2人 | 74分: 2人 | 76分: 2人 | 77分: 1人 | 78分: 1人 | 79分: 3人 | 80分: 1人 | 81分: 2人 | 83分: 1人 | 86分: 2人 | 87分: 1人 | 88分: 1人 | 89分: 1人 | 91分: 1人 | 92分: 1人 | 93分: 2人 | 97分: 1人 | 99分: 1人 |

排序后的成绩列表(前10个): [50, 50, 52, 52, 52, 52, 54, 58, 58, 58]

成绩分段统计结果:
优秀(90-100): 6人
良好(80-89): 9人
中等(70-79): 13人
及格(60-69): 12人
不及格(0-59): 10人

试题10:课程表时间冲突检测

题目描述
给定一组课程,每门课程有名称、开始时间和结束时间(用分钟表示,如540=9:00)。课程安排如下:

  • 钢琴课:540-630(9:00-10:30)
  • 绘画课:600-690(10:00-11:30)
  • 编程课:720-810(12:00-13:30)
  • 舞蹈课:780-870(13:00-14:30)
  • 围棋课:900-990(15:00-16:30)

请检测哪些课程时间存在冲突,并输出冲突的课程对。

题目要求
将时间转换为分钟整数,按开始时间排序后线性扫描,判断相邻课程是否重叠(结束时间 > 下一个开始时间)。输出所有冲突的课程信息。输出格式参照示例。

输出示例

课程表安排:
钢琴课: 09:00-10:30
绘画课: 10:00-11:30
编程课: 12:00-13:30
舞蹈课: 13:00-14:30
围棋课: 15:00-16:30

⚠️ 发现课程时间冲突:
钢琴课: 09:00-10:30
绘画课: 10:00-11:30
编程课: 12:00-13:30
舞蹈课: 13:00-14:30

试题11:班级座位表随机排列

题目描述
有30名学生,需随机分配到6列×5行的座位上。

要求:

  1. 近视学生优先安排在前排。
  2. 相邻座位(上下左右)的性别尽量均衡(避免同性别扎堆)。
  3. 座位随机化,但需满足上述约束。

学生数据:

students = [
Student("张伟", "M", False, 165),
Student("李芳", "F", True, 158), # 近视
Student("王娜", "F", False, 162),
Student("赵秀英", "F", True, 160), # 近视
Student("刘敏", "F", False, 155),
Student("陈静", "F", True, 163), # 近视
Student("杨丽", "F", False, 159),
Student("黄强", "M", False, 172),
Student("周磊", "M", True, 168), # 近视
Student("吴军", "M", False, 175),
Student("孙伟", "M", False, 170),
Student("钱芳", "F", True, 156), # 近视
Student("郑敏", "F", False, 161),
Student("冯娜", "F", False, 164),
Student("朱秀兰", "F", True, 157), # 近视
Student("秦静", "F", False, 159),
Student("许丽", "F", False, 162),
Student("何强", "M", True, 171), # 近视
Student("吕磊", "M", False, 176),
Student("曹军", "M", False, 173),
Student("金伟", "M", False, 169),
Student("魏芳", "F", True, 158), # 近视
Student("蒋敏", "F", False, 160),
Student("沈娜", "F", False, 163),
Student("韩秀兰", "F", False, 161),
Student("董静", "F", False, 162),
Student("潘丽", "F", False, 164),
Student("崔强", "M", False, 174),
Student("钟磊", "M", True, 167), # 近视
Student("彭军", "M", False, 178)
]

题目要求
实现随机化快速排序对随机生成的排列进行排序?实际上此题需要设计算法满足多目标约束,但题目要求用随机化快速排序作为基础。可简化:先生成随机顺序,再调整近视学生到前排,再局部调整性别均衡。输出座位表及统计。输出格式参照示例。

输出示例

=== 完整学生名单(30人)===
1. 张伟(男)
2. 李芳(女,近视)
3. 王娜(女)
4. 赵秀英(女,近视)
5. 刘敏(女)
6. 陈静(女,近视)
7. 杨丽(女)
8. 黄强(男)
9. 周磊(男,近视)
10. 吴军(男)
11. 孙伟(男)
12. 钱芳(女,近视)
13. 郑敏(女)
14. 冯娜(女)
15. 朱秀兰(女,近视)
16. 秦静(女)
17. 许丽(女)
18. 何强(男,近视)
19. 吕磊(男)
20. 曹军(男)
21. 金伟(男)
22. 魏芳(女,近视)
23. 蒋敏(女)
24. 沈娜(女)
25. 韩秀兰(女)
26. 董静(女)
27. 潘丽(女)
28. 崔强(男)
29. 钟磊(男,近视)
30. 彭军(男)

=== 最终座位表(6列×5行)===
李芳 女※ 赵秀英女※ 何强 男※ 周磊 男※ 魏芳 女※ 陈静 女※
钟磊 男※ 钱芳 女※ 朱秀兰女※ 冯娜 女 黄强 男 潘丽 女
吴军 男 秦静 女 崔强 男 刘敏 女 蒋敏 女 沈娜 女
张伟 男 许丽 女 曹军 男 杨丽 女 王娜 女 董静 女
吕磊 男 彭军 男 孙伟 男 金伟 男 韩秀兰女 郑敏 女

=== 座位分布统计 ===
近视学生座位分布:
第1排:6名近视学生
第2排:3名近视学生
第3排:0名近视学生
第4排:0名近视学生
第5排:0名近视学生

性别分布:
男生:12人,女生:18人

每排性别分布:
第1排:2男 4女
第2排:2男 4女
第3排:2男 4女
第4排:2男 4女
第5排:4男 2女

试题12:电子实验记录本版本管理

题目描述
给定一组实验版本号(遵循语义化版本,如 v1.0.0v2.1.0-alpha),要求按正确顺序从小到大排序。版本号列表:

["v1.0.0", 
"v2.3.1",
"v1.2.0",
"v1.11.0",
"v2.1.0-alpha",
"v2.1.0",
"v2.1.0-beta",
"v1.0.1",
"v0.9.9"]

排序规则:

  • 先按主版本号、次版本号、修订号依次比较(数字部分)。
  • 若有预发布标识符(如 -alpha-beta),则不带标识符的版本大于带标识符的,且 alpha < beta < rc < 无标识符。

请实现版本号解析与比较函数,然后排序输出。

题目要求
编写 parse_version 函数将版本字符串转换为可比较的元组,然后使用Python内置排序。输出排序前后的版本列表。

输出示例

=== 原始版本顺序 ===
v1.0.0
v2.3.1
v1.2.0
v1.11.0
v2.1.0-alpha
v2.1.0
v2.1.0-beta
v1.0.1
v0.9.9

=== 排序后版本顺序 ===
v0.9.9
v1.0.0
v1.0.1
v1.2.0
v1.11.0
v2.1.0
v2.1.0-alpha
v2.1.0-beta
v2.3.1

试题13:用太阳系行星轨道学习加权图

题目描述
将太阳和八大行星视为节点,太阳与每个行星之间的平均距离(天文单位 AU)作为边的权重,构建加权无向图。

数据如下:

    # 添加太阳和行星[2,10](@ref)
celestial_data = [
("太阳", "star"),
("水星", "planet"), ("金星", "planet"), ("地球", "planet"),
("火星", "planet"), ("木星", "planet"), ("土星", "planet"),
("天王星", "planet"), ("海王星", "planet")
]

# 添加距离关系(基于平均轨道距离,单位:AU)[2,10](@ref)
# 注意:这里简化模型,将太阳系视为链式结构,实际是太阳与各行星直接相连
distance_data = [
("太阳", "水星", 0.39), ("太阳", "金星", 0.72), ("太阳", "地球", 1.00),
("太阳", "火星", 1.52), ("太阳", "木星", 5.20), ("太阳", "土星", 9.54),
("太阳", "天王星", 19.18), ("太阳", "海王星", 30.06)
]

要求:

  1. 输出邻接表表示。
  2. 生成距离矩阵(用 INF 表示不直接相连)。
  3. 判断网络是否连通。
  4. 找出地球到木星的最短路径(由于是星型结构,路径唯一:地球-太阳-木星),并输出路径总距离。
  5. 统计每个节点的度(连接数)。

题目要求
实现加权图,使用字典存储邻接表。使用Dijkstra算法求最短路径(或直接计算)。输出格式参照示例。

输出示例

添加天体: 太阳(star)
添加天体: 水星(planet)
添加天体: 金星(planet)
添加天体: 地球(planet)
添加天体: 火星(planet)
添加天体: 木星(planet)
添加天体: 土星(planet)
添加天体: 天王星(planet)
添加天体: 海王星(planet)
添加距离关系: 太阳 ←0.39AU→ 水星
添加距离关系: 太阳 ←0.72AU→ 金星
添加距离关系: 太阳 ←1.0AU→ 地球
添加距离关系: 太阳 ←1.52AU→ 火星
添加距离关系: 太阳 ←5.2AU→ 木星
添加距离关系: 太阳 ←9.54AU→ 土星
添加距离关系: 太阳 ←19.18AU→ 天王星
添加距离关系: 太阳 ←30.06AU→ 海王星

太阳系行星轨道网络(加权图表示):
太阳 连接: 水星(0.39AU), 金星(0.72AU), 地球(1.0AU), 火星(1.52AU), 木星(5.2AU), 土星(9.54AU), 天王星(19.18AU), 海王星(30.06AU)
水星 连接: 太阳(0.39AU)
金星 连接: 太阳(0.72AU)
地球 连接: 太阳(1.0AU)
火星 连接: 太阳(1.52AU)
木星 连接: 太阳(5.2AU)
土星 连接: 太阳(9.54AU)
天王星 连接: 太阳(19.18AU)
海王星 连接: 太阳(30.06AU)

太阳系距离矩阵(单位: AU):
太阳 水星 金星 地球 火星 木星 土星 天王星 海王星
太阳 0.00 0.39 0.72 1.00 1.52 5.20 9.54 19.18 30.06
水星 0.39 0.00 INF INF INF INF INF INF INF
金星 0.72 INF 0.00 INF INF INF INF INF INF
地球 1.00 INF INF 0.00 INF INF INF INF INF
火星 1.52 INF INF INF 0.00 INF INF INF INF
木星 5.20 INF INF INF INF 0.00 INF INF INF
土星 9.54 INF INF INF INF INF 0.00 INF INF
天王星 19.18 INF INF INF INF INF INF 0.00 INF
海王星 30.06 INF INF INF INF INF INF INF 0.00

--- 太阳系连通性分析 ---
太阳系网络是否连通: True
地球 到 木星 的最短路径: 地球 → 太阳 → 木星
路径总距离: 6.20 AU

各天体的连通度(邻居数量):
太阳: 8 个连接
水星: 1 个连接
金星: 1 个连接
地球: 1 个连接
火星: 1 个连接
木星: 1 个连接
土星: 1 个连接
天王星: 1 个连接
海王星: 1 个连接

试题14:带电粒子碰撞轨迹模拟

题目描述
在一个二维平面上有6个目标点,坐标如下:

# 定义目标点位置(模拟带负电的目标)
targets = [
(0, 0), # T0: 起点
(2, 1), # T1
(4, 0), # T2
(3, 2), # T3
(1, 3), # T4
(5, 3) # T5: 终点
]

粒子从 T0 出发,每次可以从当前点移动到另一个点,移动规则为:如果两点之间的欧氏距离小于等于3,则认为可以碰撞(即可达)。请使用深度优先搜索找出所有从 T0 到 T5 的可能路径(不重复经过同一点)。输出所有路径。

题目要求
构建有向图(无向图),节点间距离≤3则连边。使用DFS回溯搜索所有路径,输出每条路径的节点序列。输出格式参照示例。

输出示例

目标点位置:
T0: (0, 0)
T1: (2, 1)
T2: (4, 0)
T3: (3, 2)
T4: (1, 3)
T5: (5, 3)

碰撞关系图(邻接表):
T0 -> ['T1', 'T2']
T1 -> ['T2', 'T3']
T2 -> ['T5']
T3 -> ['T5']
T4 -> ['T3']

找到 3 条碰撞路径:
路径1: T0(0,0) → T1(2,1) → T2(4,0) → T5(5,3)
路径2: T0(0,0) → T1(2,1) → T3(3,2) → T5(5,3)
路径3: T0(0,0) → T2(4,0) → T5(5,3)

试题15:星座观测路径优化

题目描述
星座网络中,每个星座有星等亮度(数值越小越亮),星座之间的连接权重为相邻星座的星等平均值(或简单累加)。给定星座图数据(见文档),要求从“北斗七星”到“天琴座”找到一条总星等和最小的路径(即观测条件最好的路径)。分别用 Dijkstra 算法和 BFS 算法(按跳数最少)求解,并对比结果。

图数据(节点及邻居):

# 测试数据
constellation_graph = {
'北斗七星': {'星等': 2.0, '邻居': {'大熊座α': 1.5, '仙后座': 3.0}},
'大熊座α': {'星等': 1.5, '邻居': {'北斗七星': 2.0, '小熊座β': 2.5}},
'仙后座': {'星等': 3.0, '邻居': {'北斗七星': 2.0, '天鹰座': 2.8}},
'小熊座β': {'星等': 2.5, '邻居': {'大熊座α': 1.5, '北极星': 1.0}},
'天鹰座': {'星等': 2.8, '邻居': {'仙后座': 3.0, '天琴座': 2.2}},
'北极星': {'星等': 1.0, '邻居': {'小熊座β': 2.5}},
'天琴座': {'星等': 2.2, '邻居': {'天鹰座': 2.8}}
}

(边权重为两节点星等之和?题目中邻居列表中的数字可能是星等?需明确。原文中邻居字典是星等值,但可能是节点自己的星等?实际上每个节点有自己的星等,边权应为两端星等之和或平均值。为简化,本题可设定路径总星等为经过节点的星等之和,包括起点和终点。但原文示例中“总星等和: 7.00”暗示了累加。我们按节点星等累加计算。)

题目要求
实现 Dijkstra 算法求最小星等和路径,实现 BFS 求最少跳数路径。输出两种算法的路径和总星等和,并对比说明为什么 Dijkstra 更优。

输出示例

=== 星座观测路径优化系统 ===

星等说明:数值越小,恒星越亮(观测条件越好)

星座观测系统 - 各星座信息:
----------------------------------------
北斗七星: 星等=2.0, 邻居=['大熊座α', '仙后座']
大熊座α: 星等=1.5, 邻居=['北斗七星', '小熊座β']
仙后座: 星等=3.0, 邻居=['北斗七星', '天鹰座']
小熊座β: 星等=2.5, 邻居=['大熊座α', '北极星']
天鹰座: 星等=2.8, 邻居=['仙后座', '天琴座']
北极星: 星等=1.0, 邻居=['小熊座β']
天琴座: 星等=2.2, 邻居=['天鹰座']

寻找从 [北斗七星] 到 [天琴座] 的最优观测路径:

1. Dijkstra算法结果(星等亮度最优):
路径: 北斗七星 → 大熊座α → 小熊座β → 北极星
总星等和: 7.00
经过星座数: 4

2. BFS算法结果(星座数量最少):
路径: 北斗七星 → 仙后座 → 天鹰座 → 天琴座
总星等和: 8.00
经过星座数: 4

3. 算法对比分析:
✓ Dijkstra路径更优:总星等和更小,观测条件更好
亮度改善: 12.5%

亮度差异分析:
Dijkstra路径经过了较亮恒星: 北极星

试题16:引力弹弓效应与最小能耗路径规划

题目描述
航天器从地球(Earth)飞向土星(Saturn),途中可利用金星(Venus)、火星(Mars)、木星(Jupiter)进行引力加速。简化模型中,每对天体间的转移能耗与距离成正比,但若经过行星引力加速,后续路径的能耗会按一定比例减少(动态权重)。

给定天体坐标(假设在一维直线上):

"""创建简化太阳系模型"""
# 天体数据:名称、位置(x,y,z)、质量(相对质量)
# 位置为简化坐标(天文单位),质量为相对质量因子
celestial_bodies = {
'Earth': {'position': (1.0, 0.0, 0.0), 'mass': 1.0},
'Venus': {'position': (0.7, 0.0, 0.0), 'mass': 0.8},
'Mars': {'position': (1.5, 0.0, 0.0), 'mass': 0.1},
'Jupiter': {'position': (5.2, 0.0, 0.0), 'mass': 300.0}, # 木星质量大,引力弹弓效果好
'Saturn': {'position': (9.5, 0.0, 0.0), 'mass': 100.0},
'Uranus': {'position': (19.2, 0.0, 0.0), 'mass': 14.0},
}

引力弹弓效应:若经过大质量行星(质量越大效果越强),则后续路径的能耗乘以系数 1 - 质量因子(质量因子 = 行星质量 / 100,质量数据见文档)。请设计算法找到从 Earth 到 Saturn 的最小能耗路径,考虑引力弹弓的动态权重调整。

题目要求
实现动态权重的 Dijkstra 算法,其中路径总能耗为各段距离乘以动态衰减因子。输出最优路径和总能耗,并与直接飞行的能耗对比。

输出示例

=== 引力弹弓效应轨道计算与最小能耗路径规划 ===

太阳系天体数据:
Earth: 位置(1.0, 0.0, 0.0), 相对质量1.0
Venus: 位置(0.7, 0.0, 0.0), 相对质量0.8
Mars: 位置(1.5, 0.0, 0.0), 相对质量0.1
Jupiter: 位置(5.2, 0.0, 0.0), 相对质量300.0
Saturn: 位置(9.5, 0.0, 0.0), 相对质量100.0
Uranus: 位置(19.2, 0.0, 0.0), 相对质量14.0

计算从【Earth】到【Saturn】的最小能耗路径:
考虑引力弹弓效应的动态权重调整...

✓ 路径规划成功!
最优路径: Earth → Saturn
预估总能耗: 0.10

路径详细信息:
段1: Earth→Saturn(角度:0.00)

对比分析:
直接飞行能耗: 0.10
引力弹弓路径节能: 0.0%

试题17:射电望远镜阵列布局

题目描述
有8个射电望远镜(编号0-7),需要选择一些连接构成通信网络,使得所有望远镜连通且总信号延迟最小。每个可能的连接有延迟(微秒),部分连接因地形或干扰被禁止,且单条连接延迟不得超过4.0微秒。

8个望远镜连接数据:
# 输入:8个望远镜,编号0-7
n = 8

# 所有可能的连接及其信号延迟(单位:微秒)
all_connections = [
(0, 1, 2.1), (0, 2, 1.5), (0, 3, 4.2), (0, 4, 3.8),
(1, 2, 2.8), (1, 5, 3.1), (1, 6, 5.2), (2, 3, 2.0),
(2, 7, 4.5), (3, 4, 1.8), (3, 7, 3.2), (4, 5, 2.5),
(4, 6, 4.8), (5, 6, 2.2), (5, 7, 3.7), (6, 7, 2.9)
]

# 禁止连接:望远镜0-6(因山脉阻挡),望远镜1-7(因干扰源)
forbidden_connections = {(0, 6), (1, 7)}

# 单条连接最大允许延迟
max_single_delay = 4.0

禁止连接:(0,6) 和 (1,7)。单条连接最大允许延迟:4.0微秒。请使用 Kruskal 算法求解满足约束的最小生成树,输出所选连接及总延迟。

题目要求
实现带约束的 Kruskal 算法,排除禁止连接和超过延迟上限的连接。输出最小生成树的边列表和总延迟。输出格式参照示例。

输出示例

射电望远镜阵列布局优化
==================================================
望远镜编号:0-7
禁止连接:{(1, 7), (0, 6)}
单条连接最大允许延迟:4.0微秒

所有可能的连接及信号延迟:
连接1: 望远镜0-望远镜1, 延迟: 2.1微秒 [可用]
连接2: 望远镜0-望远镜2, 延迟: 1.5微秒 [可用]
连接3: 望远镜0-望远镜3, 延迟: 4.2微秒 [禁用]
连接4: 望远镜0-望远镜4, 延迟: 3.8微秒 [可用]
连接5: 望远镜1-望远镜2, 延迟: 2.8微秒 [可用]
连接6: 望远镜1-望远镜5, 延迟: 3.1微秒 [可用]
连接7: 望远镜1-望远镜6, 延迟: 5.2微秒 [禁用]
连接8: 望远镜2-望远镜3, 延迟: 2.0微秒 [可用]
连接9: 望远镜2-望远镜7, 延迟: 4.5微秒 [禁用]
连接10: 望远镜3-望远镜4, 延迟: 1.8微秒 [可用]
连接11: 望远镜3-望远镜7, 延迟: 3.2微秒 [可用]
连接12: 望远镜4-望远镜5, 延迟: 2.5微秒 [可用]
连接13: 望远镜4-望远镜6, 延迟: 4.8微秒 [禁用]
连接14: 望远镜5-望远镜6, 延迟: 2.2微秒 [可用]
连接15: 望远镜5-望远镜7, 延迟: 3.7微秒 [可用]
连接16: 望远镜6-望远镜7, 延迟: 2.9微秒 [可用]

最优阵列布局(最小延迟连接方案):
连接1: 望远镜0-望远镜2, 延迟: 1.5微秒
连接2: 望远镜3-望远镜4, 延迟: 1.8微秒
连接3: 望远镜2-望远镜3, 延迟: 2.0微秒
连接4: 望远镜0-望远镜1, 延迟: 2.1微秒
连接5: 望远镜5-望远镜6, 延迟: 2.2微秒
连接6: 望远镜4-望远镜5, 延迟: 2.5微秒
连接7: 望远镜6-望远镜7, 延迟: 2.9微秒
总信号延迟: 15.0微秒
UV覆盖评分: 0.702(越高越好)
连通性验证: 所有望远镜形成一个整体

试题18:宇宙事件因果网络

题目描述
宇宙事件之间存在因果依赖关系,必须遵循时间顺序。给定以下事件及依赖(有向边表示前因后果):

测试数据:


# 添加宇宙事件(基于真实天文过程)
cosmic_events = [
(1, "恒星形成", "大质量恒星在星系中形成"),
(2, "恒星演化", "恒星经历完整生命周期"),
(3, "超新星爆发", "大质量恒星坍缩引发超新星爆发"),
(4, "黑洞形成", "超新星残骸坍缩形成恒星质量黑洞"),
(5, "黑洞配对", "两个黑洞在矮星系中形成配对系统[6](@ref)"),
(6, "轨道衰变", "黑洞对通过引力波辐射损失角动量[6](@ref)"),
(7, "黑洞合并", "两个黑洞最终合并形成更大黑洞[7](@ref)"),
(8, "引力波产生", "合并过程产生强烈引力波信号"),
(9, "引力波传播", "引力波以光速在宇宙中传播"),
(10, "LISA探测", "激光干涉仪太空天线探测到引力波[6](@ref)")
]

# 添加合理的因果关系(无环情况)
reasonable_causalities = [
(1, 2), # 恒星形成 → 恒星演化
(2, 3), # 恒星演化 → 超新星爆发
(3, 4), # 超新星爆发 → 黑洞形成
(4, 5), # 黑洞形成 → 黑洞配对
(5, 6), # 黑洞配对 → 轨道衰变
(6, 7), # 轨道衰变 → 黑洞合并
(7, 8), # 黑洞合并 → 引力波产生
(8, 9), # 引力波产生 → 引力波传播
(9, 10) # 引力波传播 → LISA探测
]

# 添加循环因果关系(违反因果律的情况)
cyclic_causalities = [
(10, 1), # LISA探测 → 恒星形成(时间倒流!)
(7, 3) # 黑洞合并 → 超新星爆发(因果颠倒)
]

请进行拓扑排序,输出合理的事件顺序。若添加循环依赖(如10→1, 7→3),检测并报告存在因果环。

题目要求
实现 Kahn 算法进行拓扑排序和环检测。分别测试无环依赖和有环依赖两种情况,输出结果。

输出示例

=== 宇宙事件因果网络分析 ===

测试1 - 合理的黑洞合并事件链:
检测到因果环: False
合理的事件发生顺序:
1. 恒星形成 - 大质量恒星在星系中形成
2. 恒星演化 - 恒星经历完整生命周期
3. 超新星爆发 - 大质量恒星坍缩引发超新星爆发
4. 黑洞形成 - 超新星残骸坍缩形成恒星质量黑洞
5. 黑洞配对 - 两个黑洞在矮星系中形成配对系统
6. 轨道衰变 - 黑洞对通过引力波辐射损失角动量
7. 黑洞合并 - 两个黑洞最终合并形成更大黑洞
8. 引力波产生 - 合并过程产生强烈引力波信号
9. 引力波传播 - 引力波以光速在宇宙中传播
10. LISA探测 - 激光干涉仪太空天线探测到引力波

测试2 - 有循环因果的宇宙事件:
检测到因果环: True
发现违反因果律的事件序列!
涉及循环的事件: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
这表示存在时间倒流或因果悖论,在物理学上不可能发生

测试3 - '黑洞合并'到'LISA探测'的因果链:
因果链: [7, 8, 9, 10]
详细路径:
↳ 黑洞合并
↳ 引力波产生
↳ 引力波传播
↳ LISA探测

试题19:Prim算法构建古村落通信网

题目描述
有6个古村落(编号0-5),它们之间可能的连接线路及距离如下:

# 测试数据:古村落通信网络
# 村落编号:0-5代表6个古村落
villages_connections = [
(0, 1, 10), # 村落0到村落1,距离10公里
(0, 2, 20), # 村落0到村落2,距离20公里
(1, 2, 15), # 村落1到村落2,距离15公里
(1, 3, 25), # 村落1到村落3,距离25公里
(2, 4, 30), # 村落2到村落4,距离30公里
(3, 4, 20), # 村落3到村落4,距离20公里
(3, 5, 15), # 村落3到村落5,距离15公里
(4, 5, 10) # 村落4到村落5,距离10公里
]

请使用 Prim 算法(从0开始)找出连接所有村落的最小总成本网络,输出选择的线路及总成本。

题目要求
实现 Prim 算法(可用优先队列优化),输出最小生成树的边及总距离。输出格式参照示例。

输出示例

=== 古村落通信网络最小成本规划 ===
村落连接关系及距离:
村落0 ↔ 村落1 : 10公里
村落0 ↔ 村落2 : 20公里
村落1 ↔ 村落2 : 15公里
村落1 ↔ 村落3 : 25公里
村落2 ↔ 村落4 : 30公里
村落3 ↔ 村落4 : 20公里
村落3 ↔ 村落5 : 15公里
村落4 ↔ 村落5 : 10公里
==================================================
📡 最小成本通信网络规划结果:
选择的连接线路:
线路1: 村落0 ↔ 村落1 : 10公里
线路2: 村落1 ↔ 村落2 : 15公里
线路3: 村落1 ↔ 村落3 : 25公里
线路4: 村落3 ↔ 村落5 : 15公里
线路5: 村落5 ↔ 村落4 : 10公里
总成本: 75公里
连接村落数量: 6个
✅ 成功连接所有村落!

试题20:传统文化中的数字排列——单调递增数字

题目描述
给定一个正整数 n,求小于或等于 n 的最大整数,且该整数的各位数字从左到右单调不减(即每个数字不小于前一个数字)。例如 322 应返回 299

    # 测试案例:传统文化中的吉祥数字
test_cases = [
10, # 示例1:10 → 9
1234, # 示例2:1234 → 1234 (本身就是单调递增)
332, # 示例3:332 → 299
100, # 示例4:100 → 99
4321, # 示例5:4321 → 3999
2876, # 示例6:2876 → 2799
]

题目要求
实现贪心算法:从高位到低位扫描,找到第一个递减位置,将该位减1,后面所有位设为9。注意处理前导0(实际不会出现,因数字本身可能减小位数?但如100应得99)。输出每个用例的转换结果。

输出示例

传统文化中,单调递增的数字象征着顺利和吉祥
让我们分析几个数字的转化过程:
案例1: 原始数字 = 10
转换结果 = 9
案例2: 原始数字 = 1234
转换结果 = 1234
案例3: 原始数字 = 332
转换结果 = 299
案例4: 原始数字 = 100
转换结果 = 99
案例5: 原始数字 = 4321
转换结果 = 3999
案例6: 原始数字 = 2876
转换结果 = 2799

试题21:京杭大运河货物运输最小成本路径

题目描述
运河运输网络可抽象为一个4×4的网格,每个格子表示一个中转站,格子内的数字表示经过该站点的运输成本(元/吨)。从左上角(0,0)出发,只能向右或向下移动,到达右下角(3,3)。网格成本如下:

    # 模拟运河运输网络:杭州→苏州→镇江→济宁的运输成本
# 数据代表不同运输路段的成本(单位:元/吨)
canal_network = [
[2, 4, 1, 3], # 杭州到周边城市的基础运输成本
[1, 3, 2, 1], # 苏南地区运输成本
[3, 1, 1, 2], # 苏北地区运输成本
[2, 2, 3, 1] # 鲁南地区到梁山港的成本
]

请使用动态规划求最小总运输成本,并输出最终的DP表格及最小成本。

题目要求
实现二维动态规划,状态 dp[i][j] 表示从起点到 (i,j) 的最小成本。输出最终DP表格和最小成本。

输出示例

京杭大运河货物运输最小成本路径规划
============================================================
运河运输网络成本图:
2 4 1 3
1 3 2 1
3 1 1 2
2 2 3 1

最终DP表格:
2 6 7 10
3 6 8 9
6 7 8 10
8 9 11 11

最小运输成本: 11 元/吨

试题22:背包问题与应用——“一和零”的二进制字符串选择

题目描述
给定一个二进制字符串列表,以及两个整数 m 和 n,分别表示最多能拥有的0的个数和1的个数。每个字符串要么全选要么不选。求最多能选多少个字符串,使得所选字符串中0的总数 ≤ m,1的总数 ≤ n。

测试用例:

"""用多个例子演示算法"""
examples = [
{
"strs": ["10", "0001", "111001", "1", "0"],
"m": 5,
"n": 3,
"description": "经典示例:可以选出4个字符串"
},
{
"strs": ["111", "000", "1010"],
"m": 2,
"n": 2,
"description": "限制严格示例:选择有限"
}
]

请对每个用例输出最大子集大小。

题目要求
将问题转化为二维费用背包问题,使用动态规划(状态压缩)求解。输出每个用例的结果。

输出示例

一和零问题:二维费用背包实战
============================================================

示例 1: 经典示例:可以选出4个字符串
字符串列表: ['10', '0001', '111001', '1', '0']
限制条件: 最多5个0, 最多3个1
==================================================
🎯 结果: 最大子集大小为 4
============================================================

示例 2: 限制严格示例:选择有限
字符串列表: ['111', '000', '1010']
限制条件: 最多2个0, 最多2个1
==================================================
🎯 结果: 最大子集大小为 1

试题23:古诗对齐中的最长公共子序列

题目描述
给定两首古诗(字符串),求它们的最长公共子序列(LCS)的长度和具体序列(不要求连续但顺序一致)。测试用例:

#测试数据 古诗例子
poems = [
{
"title1": "《静夜思》",
"poem1": "床前明月光 疑是地上霜",
"title2": "《望月怀远》",
"poem2": "海上生明月 天涯共此时",
"description": "经典例子:都包含'明月'"
},
{
"title1": "《春晓》",
"poem1": "春眠不觉晓 处处闻啼鸟",
"title2": "《春夜喜雨》",
"poem2": "好雨知时节 当春乃发生",
"description": "中等难度:共同字符较少"
}
]

请输出每对古诗的LCS长度和具体序列(若有多个,输出任意一个)。

题目要求
实现动态规划算法求解LCS,输出长度和序列。输出格式参照示例。

输出示例

古诗对齐:最长公共子序列(LCS)探索
通过动态规划发现古诗中的隐藏联系!

============================================================
例子 1: 经典例子:都包含'明月'
============================================================
《静夜思》: 床前明月光 疑是地上霜
《望月怀远》: 海上生明月 天涯共此时
古诗LCS分析:
诗1: 床前明月光疑是地上霜
诗2: 海上生明月天涯共此时

分析结果:
最长公共子序列长度: 2
具体序列: 明月
============================================================

============================================================
例子 2: 中等难度:共同字符较少
============================================================
《春晓》: 春眠不觉晓 处处闻啼鸟
《春夜喜雨》: 好雨知时节 当春乃发生
古诗LCS分析:
诗1: 春眠不觉晓处处闻啼鸟
诗2: 好雨知时节当春乃发生

分析结果:
最长公共子序列长度: 1
具体序列: 春
============================================================

试题24:古建筑修复成本优化

题目描述
一段长20米的城墙上有5个破损点,位置分别为 [2, 5, 8, 12, 15] 米处。每次可以修复一段连续区间,成本等于该段长度。修复时可以选择任意顺序,但每次修复必须覆盖一段连续破损区域(可能包含已修复段?题目应理解为每次修复一段连续的破损区间,且修复后该段变为完好,后续修复不能断开?实际上类似“合并石子”问题:每次修复一段连续破损,成本为区间长度,修复后该段合并,后续修复若跨越已修复段则整体长度累加。但原题描述类似区间DP:有破损点,每次修复一段连续城墙(可能包含完好部分?),成本为该段长度。要求最小总成本。这类似于“最优二叉搜索树”或“矩阵链乘”的区间DP。

更准确描述:有n个破损点,它们将城墙分成若干段。每次可以选择一个破损点进行修复,但修复一个点实际上会将该点变为完好,且其左右两侧若已修复则可连通成更大连续段?原题输出示例显示DP过程较长,我们简化:给定破损点位置,求最小修复总成本,其中修复一段连续区间(从某个破损点到另一个破损点)的成本等于区间长度(即最后一个破损点坐标减第一个破损点坐标)。每次修复后该段内的所有破损点被修复,后续不能再单独修复其中的点。求修复所有破损点的最小总成本。

实际上这是“戳气球”或“合并石子”的变形。我们按原题提供的数据和输出示例,可以理解为区间DP:状态 dp[i][j] 表示修复从第i个破损点到第j个破损点这段区间的最小成本,转移时枚举最后修复的断点k,成本为 dp[i][k-1] + dp[k+1][j] + (pos[j+1] - pos[i-1]),其中边界需要处理虚拟端点0和城墙末端20。

题目要求:对给定的场景(城墙长20,破损点[2,5,8,12,15])求解最小成本,并输出DP过程(可选)和最终结果。

#测试数据:演示不同场景下的修复成本优化
scenarios = [
{
"name": "基础案例-5个破损点",
"wall_length": 20,
"damage_points": [2, 5, 8, 12, 15],
"description": "中等复杂度,展示典型优化效果"
},
{
"name": "简单案例-3个破损点",
"wall_length": 10,
"damage_points": [3, 6, 9],
"description": "简单案例,便于理解算法流程"
}
]

题目要求
实现区间动态规划,输出最小修复成本。可参考示例输出中的过程(简化或只输出最终结果)。但示例给出了详细过程,竞赛题可要求输出最终成本即可。为简化,本题只要求输出最小成本。

输出示例

🏯 古建筑修复成本优化系统
============================================================

场景1: 基础案例-5个破损点
描述: 中等复杂度,展示典型优化效果
--------------------------------------------------
古建筑修复成本优化分析
==================================================
城墙总长度: 20米
破损点位置: [2, 5, 8, 12, 15]
完整点序列: [0, 2, 5, 8, 12, 15, 20]

开始动态规划填表过程:
----------------------------------------

处理区间[0-5],长度5米
分割点2: 成本 = dp[0][1](0) + dp[1][2](0) + 5 = 5
✅ 更新最小成本: 5

处理区间[2-8],长度6米
分割点5: 成本 = dp[1][2](0) + dp[2][3](0) + 6 = 6
✅ 更新最小成本: 6

处理区间[5-12],长度7米
分割点8: 成本 = dp[2][3](0) + dp[3][4](0) + 7 = 7
✅ 更新最小成本: 7

处理区间[8-15],长度7米
分割点12: 成本 = dp[3][4](0) + dp[4][5](0) + 7 = 7
✅ 更新最小成本: 7

处理区间[12-20],长度8米
分割点15: 成本 = dp[4][5](0) + dp[5][6](0) + 8 = 8
✅ 更新最小成本: 8

处理区间[0-8],长度8米
分割点2: 成本 = dp[0][1](0) + dp[1][3](6) + 8 = 14
✅ 更新最小成本: 14
分割点5: 成本 = dp[0][2](5) + dp[2][3](0) + 8 = 13
✅ 更新最小成本: 13

处理区间[2-12],长度10米
分割点5: 成本 = dp[1][2](0) + dp[2][4](7) + 10 = 17
✅ 更新最小成本: 17
分割点8: 成本 = dp[1][3](6) + dp[3][4](0) + 10 = 16
✅ 更新最小成本: 16

处理区间[5-15],长度10米
分割点8: 成本 = dp[2][3](0) + dp[3][5](7) + 10 = 17
✅ 更新最小成本: 17
分割点12: 成本 = dp[2][4](7) + dp[4][5](0) + 10 = 17
❌ 保持当前最小成本: 17

处理区间[8-20],长度12米
分割点12: 成本 = dp[3][4](0) + dp[4][6](8) + 12 = 20
✅ 更新最小成本: 20
分割点15: 成本 = dp[3][5](7) + dp[5][6](0) + 12 = 19
✅ 更新最小成本: 19

处理区间[0-12],长度12米
分割点2: 成本 = dp[0][1](0) + dp[1][4](16) + 12 = 28
✅ 更新最小成本: 28
分割点5: 成本 = dp[0][2](5) + dp[2][4](7) + 12 = 24
✅ 更新最小成本: 24
分割点8: 成本 = dp[0][3](13) + dp[3][4](0) + 12 = 25
❌ 保持当前最小成本: 24

处理区间[2-15],长度13米
分割点5: 成本 = dp[1][2](0) + dp[2][5](17) + 13 = 30
✅ 更新最小成本: 30
分割点8: 成本 = dp[1][3](6) + dp[3][5](7) + 13 = 26
✅ 更新最小成本: 26
分割点12: 成本 = dp[1][4](16) + dp[4][5](0) + 13 = 29
❌ 保持当前最小成本: 26

处理区间[5-20],长度15米
分割点8: 成本 = dp[2][3](0) + dp[3][6](19) + 15 = 34
✅ 更新最小成本: 34
分割点12: 成本 = dp[2][4](7) + dp[4][6](8) + 15 = 30
✅ 更新最小成本: 30
分割点15: 成本 = dp[2][5](17) + dp[5][6](0) + 15 = 32
❌ 保持当前最小成本: 30

处理区间[0-15],长度15米
分割点2: 成本 = dp[0][1](0) + dp[1][5](26) + 15 = 41
✅ 更新最小成本: 41
分割点5: 成本 = dp[0][2](5) + dp[2][5](17) + 15 = 37
✅ 更新最小成本: 37
分割点8: 成本 = dp[0][3](13) + dp[3][5](7) + 15 = 35
✅ 更新最小成本: 35
分割点12: 成本 = dp[0][4](24) + dp[4][5](0) + 15 = 39
❌ 保持当前最小成本: 35

处理区间[2-20],长度18米
分割点5: 成本 = dp[1][2](0) + dp[2][6](30) + 18 = 48
✅ 更新最小成本: 48
分割点8: 成本 = dp[1][3](6) + dp[3][6](19) + 18 = 43
✅ 更新最小成本: 43
分割点12: 成本 = dp[1][4](16) + dp[4][6](8) + 18 = 42
✅ 更新最小成本: 42
分割点15: 成本 = dp[1][5](26) + dp[5][6](0) + 18 = 44
❌ 保持当前最小成本: 42

处理区间[0-20],长度20米
分割点2: 成本 = dp[0][1](0) + dp[1][6](42) + 20 = 62
✅ 更新最小成本: 62
分割点5: 成本 = dp[0][2](5) + dp[2][6](30) + 20 = 55
✅ 更新最小成本: 55
分割点8: 成本 = dp[0][3](13) + dp[3][6](19) + 20 = 52
✅ 更新最小成本: 52
分割点12: 成本 = dp[0][4](24) + dp[4][6](8) + 20 = 52
❌ 保持当前最小成本: 52
分割点15: 成本 = dp[0][5](35) + dp[5][6](0) + 20 = 55
❌ 保持当前最小成本: 52

📊 优化结果:
最小修复成本: 52
城墙长度: 20米
破损点数量: 5个
平均每米成本: 2.60
✅ 成本验证通过
============================================================

场景2: 简单案例-3个破损点
描述: 简单案例,便于理解算法流程
--------------------------------------------------
古建筑修复成本优化分析
==================================================
城墙总长度: 10米
破损点位置: [3, 6, 9]
完整点序列: [0, 3, 6, 9, 10]

开始动态规划填表过程:
----------------------------------------

处理区间[0-6],长度6米
分割点3: 成本 = dp[0][1](0) + dp[1][2](0) + 6 = 6
✅ 更新最小成本: 6

处理区间[3-9],长度6米
分割点6: 成本 = dp[1][2](0) + dp[2][3](0) + 6 = 6
✅ 更新最小成本: 6

处理区间[6-10],长度4米
分割点9: 成本 = dp[2][3](0) + dp[3][4](0) + 4 = 4
✅ 更新最小成本: 4

处理区间[0-9],长度9米
分割点3: 成本 = dp[0][1](0) + dp[1][3](6) + 9 = 15
✅ 更新最小成本: 15
分割点6: 成本 = dp[0][2](6) + dp[2][3](0) + 9 = 15
❌ 保持当前最小成本: 15

处理区间[3-10],长度7米
分割点6: 成本 = dp[1][2](0) + dp[2][4](4) + 7 = 11
✅ 更新最小成本: 11
分割点9: 成本 = dp[1][3](6) + dp[3][4](0) + 7 = 13
❌ 保持当前最小成本: 11

处理区间[0-10],长度10米
分割点3: 成本 = dp[0][1](0) + dp[1][4](11) + 10 = 21
✅ 更新最小成本: 21
分割点6: 成本 = dp[0][2](6) + dp[2][4](4) + 10 = 20
✅ 更新最小成本: 20
分割点9: 成本 = dp[0][3](15) + dp[3][4](0) + 10 = 25
❌ 保持当前最小成本: 20

📊 优化结果:
最小修复成本: 20
城墙长度: 10米
破损点数量: 3个
平均每米成本: 2.00
✅ 成本验证通过
============================================================

试题25:古诗词作者校对系统

题目描述
设计一个古诗词作者校对系统,能够处理大规模古诗词数据,实现作者信息的去重与校验。给定测试数据(诗作,作者名),其中可能包含同一诗作被不同作者名记录的情况(如李白与李太白),需要根据作者别名映射统一作者。数据如下:


self.author_poems = {} # 作者到诗作的映射
self.poem_to_author = {} # 诗作到作者的映射(用于去重)
self.author_variations = { # 作者别名统一映射
'李白': ['李太白', '太白', '诗仙'],
'杜甫': ['杜子美', '子美', '诗圣'],
'苏轼': ['苏东坡', '东坡', '苏子瞻']
}

# 添加测试数据
test_data = [
("朝辞白帝彩云间", "李白"),
("床前明月光", "李白"),
("春眠不觉晓", "孟浩然"),
("国破山河在", "杜甫"),
("明月几时有", "苏轼"),
("朝辞白帝彩云间", "李太白"), # 重复诗作,不同作者名
("静夜思", "李白"),
("静夜思", "太白") # 重复诗作
]

作者别名映射:

  • 李白别名:李太白、太白、诗仙
  • 杜甫别名:杜子美、子美、诗圣
  • 苏轼别名:苏东坡、东坡、苏子瞻

要求:

  1. 添加所有数据,遇到重复诗作(内容相同)则拒绝添加,并输出提示。
  2. 统计每位作者的诗作数量(按标准姓名)。
  3. 对比使用朴素算法(列表遍历)和优化算法(集合/字典)在去重时的性能(如查找重复诗作的时间),输出性能对比。

题目要求
实现 AuthorProofreader 类,包含添加诗作、统计、性能对比等方法。输出添加过程、统计结果和性能对比。

输出示例

=== 古诗词作者校对系统 ===

√ 添加成功:《朝辞白帝彩云间》- 李白
√ 添加成功:《床前明月光》- 李白
√ 添加成功:《春眠不觉晓》- 孟浩然
√ 添加成功:《国破山河在》- 杜甫
√ 添加成功:《明月几时有》- 苏轼
× 添加失败(重复):《朝辞白帝彩云间》- 李太白
√ 添加成功:《静夜思》- 李白
× 添加失败(重复):《静夜思》- 太白

=== 李白诗作统计 ===
1. 朝辞白帝彩云间
2. 床前明月光
3. 静夜思

=== 作者统计 ===
李白: 3首
孟浩然: 1首
杜甫: 1首
苏轼: 1首

=== 算法性能对比测试 ===
优化算法耗时: 0.0011秒
朴素算法耗时: 0.5651秒
性能提升: 522.6倍
检测到重复诗作: 2首

试题26:传统纹样生成算法的空间复杂度优化

题目描述
使用生成器惰性生成传统对称纹样(例如菱形纹)。要求生成一个9行的菱形图案,由 # 组成,行数为奇数,中间行最长,上下对称。不使用生成器时,需要存储所有行;使用生成器则逐行生成,节省内存。请分别实现“完全存储”和“生成器”两种方式,并输出生成的图案。对比两种方式的内存占用(可简单通过存储元素个数说明)。

题目要求
实现函数 generate_pattern(levels)levels=5 表示最宽处有5个 #,总行数为9。完全存储版本返回列表,生成器版本使用 yield 逐行输出。输出两种方式生成的图案,并给出空间对比说明。

输出示例

=== 基础版本:完全存储模式 ===
生成的中间图案数量: 9
存储的内容示例:
生成第1行: #
生成第2行: ###
生成第3行: #####
生成第4行: #######
生成第5行: #########
生成第6行: #######
生成第7行: #####
生成第8行: ###
生成第9行: #

最终图案:
#
###
#####
#######
#########
#######
#####
###
#

============================================================
=== 优化版本:生成器惰性计算 ===
生成 5 级传统对称纹样
使用生成器,不预先计算所有行...
生成器创建完成,尚未开始计算

开始逐行生成:
生成第1行: #
生成第2行: ###
生成第3行: #####
生成第4行: #######
生成第5行: #########
生成第6行: #######
生成第7行: #####
生成第8行: ###
生成第9行: #

最终图案(逐行生成,不存储中间状态):
#
###
#####
#######
#########
#######
#####
###
#

试题27:飞花令辅助系统

题目描述
设计一个飞花令查询辅助系统,能够快速找出包含特定字且不属于指定题材的所有诗句。给定7首示例诗歌(数据见文档),每首诗歌包含标题、作者、内容、题材集合。要求实现两种查询方式:

  1. 列表遍历法:遍历所有诗歌,检查内容是否包含关键字,题材是否不包含排除题材。
  2. 集合运算法:预先建立每个字到诗歌的倒排索引,以及每个题材到诗歌的索引,利用集合差集快速得到结果。

对关键字“月”和排除题材“战争”进行查询,输出两种方法的结果和耗时对比。

"""初始化示例诗歌数据"""
sample_poems = [
{"title": "静夜思", "author": "李白", "content": "床前明月光,疑是地上霜。举头望明月,低头思故乡。",
"themes": {"思乡", "月亮"}},
{"title": "春望", "author": "杜甫", "content": "国破山河在,城春草木深。感时花溅泪,恨别鸟惊心。",
"themes": {"战争", "爱国"}},
{"title": "水调歌头", "author": "苏轼", "content": "明月几时有,把酒问青天。不知天上宫阙,今夕是何年。",
"themes": {"月亮", "抒情"}},
{"title": "出塞", "author": "王昌龄",
"content": "秦时明月汉时关,万里长征人未还。但使龙城飞将在,不教胡马度阴山。",
"themes": {"月亮", "战争", "边塞"}},
{"title": "望月怀远", "author": "张九龄", "content": "海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。",
"themes": {"月亮", "思念"}},
{"title": "木兰诗", "author": "佚名", "content": "朔气传金柝,寒光照铁衣。将军百战死,壮士十年归。",
"themes": {"战争", "英雄"}},
{"title": "山居秋暝", "author": "王维", "content": "明月松间照,清泉石上流。竹喧归浣女,莲动下渔舟。",
"themes": {"月亮", "山水"}},
]

题目要求
实现诗歌库,支持按关键字和排除题材查询。输出查询结果和性能对比。

输出示例

=== 飞花令诗词查询辅助系统 ===
系统功能:快速查找包含指定字且排除特定题材的诗句
诗歌库数量:7 首
现有题材分类:山水, 爱国, 月亮, 思念, 英雄, 思乡, 边塞, 抒情, 战争

==================================================
1. 单次查询演示
2. 性能对比测试
3. 退出系统
请选择功能(1-3): 1
请输入要查询的关键字: 月
请输入要排除的题材(多个用逗号分隔): 战争

列表遍历法结果 (共4首):
============================================================
1. 《静夜思》 - 李白
诗句: 床前明月光,疑是地上霜。举头望明月,低头思故乡。
题材: 月亮, 思乡

2. 《水调歌头》 - 苏轼
诗句: 明月几时有,把酒问青天。不知天上宫阙,今夕是何年。
题材: 抒情, 月亮

3. 《望月怀远》 - 张九龄
诗句: 海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。
题材: 月亮, 思念

4. 《山居秋暝》 - 王维
诗句: 明月松间照,清泉石上流。竹喧归浣女,莲动下渔舟。
题材: 山水, 月亮


集合运算法结果 (共4首):
============================================================
1. 《静夜思》 - 李白
诗句: 床前明月光,疑是地上霜。举头望明月,低头思故乡。
题材: 月亮, 思乡

2. 《水调歌头》 - 苏轼
诗句: 明月几时有,把酒问青天。不知天上宫阙,今夕是何年。
题材: 抒情, 月亮

3. 《望月怀远》 - 张九龄
诗句: 海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。
题材: 月亮, 思念

4. 《山居秋暝》 - 王维
诗句: 明月松间照,清泉石上流。竹喧归浣女,莲动下渔舟。
题材: 山水, 月亮

结果一致性检查: 通过

==================================================
1. 单次查询演示
2. 性能对比测试
3. 退出系统
请选择功能(1-3): 2
请输入要查询的关键字: 月
请输入要排除的题材(多个用逗号分隔): 战争
请输入测试次数: 2
正在查询包含『月』且不包含题材{'战争'}的诗句...

性能测试结果 (2次查询):
列表遍历法总耗时: 0.000029 秒
集合运算法总耗时: 0.000020 秒
集合运算比列表遍历快 1.5 倍!
找到 4 首符合条件诗歌

==================================================
1. 单次查询演示
2. 性能对比测试
3. 退出系统
请选择功能(1-3): 3
感谢使用飞花令辅助系统!

试题28:传统节日文化展示优化

题目描述
策划一场传统节日文化活动,场地最大宽度为10,总时间为8个单位。有6个展台,每个展台需要占用一定宽度、耗时、产生人气值和文化影响力(数据如下):

# 设置场地和时间限制
MAX_WIDTH = 10 # 场地最大宽度
TOTAL_TIME = 8 # 总时间单位

# 定义传统节日文化展台数据
# 每个展台:(宽度, 耗时, 人气值, 文化影响力)
traditional_booths = [
(2, 3, 5, 4), # 春节展台:写春联、剪纸
(3, 2, 6, 5), # 元宵展台:灯笼制作、灯谜
(4, 4, 8, 7), # 端午展台:包粽子、龙舟模型
(3, 3, 7, 6), # 中秋展台:月饼制作、赏月
(2, 2, 4, 4), # 重阳展台:菊花酒、登高
(5, 3, 9, 8), # 七夕展台:刺绣、鹊桥
]

要求在宽度和时间限制内选择展台组合,使得总效益(人气值 + 文化影响力)最大化。请使用三维动态规划求解,并输出最优方案的总效益、所用展台列表,以及动态规划表的部分内容。

题目要求
实现三维DP(展台索引、已用宽度、已用时间),状态转移为选或不选。输出最大总效益、选择的展台、以及DP表的部分行(如宽度0-6,时间0-6的最终值)。输出格式参照示例。

输出示例

=== 传统节日文化展示优化系统 ===
场地限制: 宽度10单位,时间8单位

可用展台列表:
春节展台: 宽度2, 耗时3, 人气5, 文化影响力4
元宵展台: 宽度3, 耗时2, 人气6, 文化影响力5
端午展台: 宽度4, 耗时4, 人气8, 文化影响力7
中秋展台: 宽度3, 耗时3, 人气7, 文化影响力6
重阳展台: 宽度2, 耗时2, 人气4, 文化影响力4
七夕展台: 宽度5, 耗时3, 人气9, 文化影响力8

=== 最优安排方案 ===
最大总效益: 38
使用场地: 宽度10/10, 时间8/8
选择的展台:
中秋展台: 宽度3, 耗时3, 人气7, 文化影响力6
重阳展台: 宽度2, 耗时2, 人气4, 文化影响力4
七夕展台: 宽度5, 耗时3, 人气9, 文化影响力8
总人气值: 20
总文化影响力: 18

=== 动态规划表(部分)===
宽度\时间 0 1 2 3 4 5 6
W=0 | 0 0 0 0 0 0 0
W=1 | 0 0 0 0 0 0 0
W=2 | 0 0 8 9 9 9 9
W=3 | 0 0 11 13 13 13 13
W=4 | 0 0 11 13 15 17 17
W=5 | 0 0 11 17 19 21 22
W=6 | 0 0 11 17 19 24 24
W=7 | 0 0 11 17 19 25 26

=== 不同策略对比 ===
单一目标优化:
仅优化人气: 效益20, 展台['春节', '元宵', '七夕']
仅优化影响力: 效益18, 展台['中秋', '重阳', '七夕']
多目标优化: 效益38, 展台['中秋', '重阳', '七夕']

=== 效益分析 ===
多目标优化方案的实际效果:
- 人气值: 20 (占最大可能性的100.0%)
- 文化影响力: 18 (占最大可能性的100.0%)
说明:多目标优化在两者之间取得了良好平衡