1. 题目背景与核心需求解析
这道来自USACO青铜级2021年2月赛的"牛年"题目,表面看是个关于生肖年份转换的问题,实际上考察的是集合与映射这两种基础数据结构的灵活应用。题目给出了一系列事件发生的年份(公历Gregorian年份)和对应的生肖(每12年循环一次),要求我们计算特定生肖年份之间的时间跨度。
1.1 题目关键数据模型
题目中涉及三个核心数据要素:
- 生肖循环:["Ox", "Tiger", "Rabbit", "Dragon", "Snake", "Horse", "Goat", "Monkey", "Rooster", "Dog", "Pig", "Rat"] 的12年周期
- 事件记录:如"Mildred born in Ox year"这样的N条语句(1≤N≤100)
- 查询需求:计算Bessie(出生在牛年)和Elsie之间的年份差
1.2 核心算法需求
需要实现两个关键功能:
- 建立从人物到出生年份的映射(unordered_map或字典)
- 处理相对年份描述(如"previous Ox year")时的生肖周期计算
2. 数据结构设计与实现细节
2.1 生肖周期建模
首先需要将生肖顺序编码为可计算的形式。这里采用数组存储生肖顺序,通过模运算处理循环特性:
cpp复制const vector<string> ZODIAC = {"Ox", "Tiger", "Rabbit", "Dragon", "Snake",
"Horse", "Goat", "Monkey", "Rooster", "Dog", "Pig", "Rat"};
2.2 人物-年份映射构建
使用哈希表存储每个人的出生年份,这里有个关键技巧:由于年份是相对的,我们需要选择一个基准点。通常将Bessie的出生年设为0,其他年份相对计算:
cpp复制unordered_map<string, int> birthYear;
birthYear["Bessie"] = 0;
2.3 相对年份计算算法
处理每条语句时,需要解析四个关键信息:
- 目标人物(如"Mildred")
- 参照人物(如"
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容