1. 题目背景与需求解析
这道来自USACO青铜组2021年2月月赛的"牛年"题目,表面看是个关于生肖年份计算的简单问题,实则考察了集合与映射这两种基础数据结构的灵活运用能力。题目给出了一系列事件发生的年份(采用生肖纪年法表示),要求计算这些事件之间的时间跨度。
1.1 生肖纪年特点
生肖纪年以12年为一个循环周期,每个年份对应一个生肖(鼠、牛、虎...猪)。题目特别之处在于:
- 采用"Ox"形式表示牛年(如"Ox 1"表示第一个牛年)
- 非牛年用"previous/next Ox"加偏移量表示(如"previous Ox 3"表示当前牛年前第3年)
1.2 核心需求拆解
需要实现两个核心功能:
- 将各种格式的生肖年份转换为统一的绝对年份(便于计算时间差)
- 处理输入事件序列,找出相邻事件的最大时间间隔
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据结构选型与设计
2.1 生肖与数字的映射关系
首先需要建立生肖名称到顺序编号的映射:
python复制zodiac_map = {
"Ox": 0, "Tiger": 1, "Rabbit": 2,
"Dragon": 3, "Snake": 4, "Horse": 5,
"Goat": 6, "Monkey": 7, "Rooster": 8,
"Dog": 9, "Pig": 10, "Rat": 11
}
2.2 事件处理数据结构
每个事件包含三个关键信息:
- 涉及的牛名称(用于关联事件顺序)
- 年份描述(需要解析为绝对年份)
- 发生顺序(根据输入顺序确定)
使用字典存储牛的事件记录是理想选择:
python复制cow_events = {
"Bessie": [("Ox", 0)] # 初始基准点
}
3. 年份解析算法实现
3.1 绝对年份计算原理
以Bessie出生的牛年("Ox 0")为基准年,其他年份根据描述计算:
- 如果是"Ox Y"格式:直接取Y*12(每个牛年间隔12年)
- 如果是"previous/next Ox"格式:
- 先确定参考牛年位置
- 根据生肖顺序计算偏移量
3.2 具体实现步骤
python复制def parse_year(
