喵哈喽~ 主人你好呀!今天本喵要给你讲解一道超级可爱的入门题:Codeforces 45A - Codecraft III。这道题就像数猫爪一样简单,我们一起来看看吧!喵~
题目大意
这道题是说呀,有一个叫 Vasya 的人,他知道他最喜欢的游戏《Codecraft III》将在 k
个月后发布。他还知道现在的月份是 s
。他想请你帮忙算一算,游戏到底会在几月份发布呢?
输入会给你两行:
- 第一行是当前月份的英文名(比如 "November")。
- 第二行是一个整数
k
(0 ≤ k ≤ 100),表示需要等待的月数。
你的任务就是输出 k
个月后的月份的英文名。
举个栗子🌰: 如果现在是 November
(十一月),要等 3
个月。 那我们数一下:
- 过 1 个月是
December
(十二月) - 过 2 个月是
January
(一月) - 过 3 个月是
February
(二月)
所以答案就是 February
啦!是不是很简单呢?喵~
题解方法
解决这个问题最直接的办法,就是把月份和数字联系起来!计算机可不像我们一样能直接理解 "November" 后面是 "December",但它们处理数字可快了!
所以我们的思路是:
- 月份数字化:我们先把 12 个月份排个队,从 0 开始编号。比如
January
是 0,February
是 1,...,December
是 11。 - 找到当前月份的数字:读入给定的月份字符串
s
,然后找到它对应的数字编号。 - 计算未来月份的数字:用当前月份的数字加上要等待的月数
k
。 - 处理年份循环:月份是 12 个月一循环的,就像一个时钟。所以,当我们把当前月份的数字加上
k
之后,需要对 12 取余数(也就是做模运算)。这样,即使结果超过 11,也能正确地绕回到年初。公式就是:(当前月份编号 + k) % 12
。 - 数字转回月份:最后,把计算出的新数字再转换回对应的月份英文名,然后输出就好啦!
这个方法是不是很清晰呀?喵呜~
题解代码
这是 C++ 的解法,主人请看~
cpp
#include <iostream>
#include <string>
#include <vector>
#include <map>
int main() {
// 为了提高读写速度,可以让 cin 和 cout 不再同步 C 语言的 stdio,会快一点点哦~
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
// 我们先把所有月份的名字按顺序放进一个叫 months 的小篮子里(也就是 vector 啦~)。
// 这样我们就可以用数字 0 到 11 来方便地取出对应的月份名字喵。
const std::vector<std::string> months = {
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
};
// 然后呢,为了能快速地从月份名字找到它的数字编号,
// 我们用了一个叫 map 的神奇小本本。它能把每个月份名字(比如 "November")
// 和它的编号(比如 10)对应起来,一查就知道了,超方便的!
std::map<std::string, int> month_to_index;
for (int i = 0; i < 12; ++i) {
month_to_index[months[i]] = i;
}
// 读入当前月份 s 和要等待的月数 k
std::string s;
std::cin >> s;
int k;
std::cin >> k;
// 用我们的小本本 map 查出当前月份的编号
int current_index = month_to_index[s];
// 最关键的一步来啦!计算 k 个月后的月份编号。
// (current_index + k) % 12
// 这个 % 就是取余数的意思。比如说,现在是10月(编号9),过了5个月,
// (9 + 5) % 12 就是 14 % 12,余数是 2。编号 2 对应的就是三月,对不对呀?
// 这样就不用担心月份超过 11 啦,它会自动绕回来的喵~
int new_index = (current_index + k) % 12;
// 最后,用计算出的新编号,从我们的小篮子 vector 里取出对应的月份名字并打印出来!
std::cout << months[new_index] << std::endl;
return 0;
}
知识点介绍
这道题虽然简单,但用到的工具可是很有用的哦!
模运算 (Modulo Operation)
- 在代码里就是那个
%
符号啦。a % n
的意思是计算a
除以n
的余数。 - 模运算在处理周期性或循环性的问题时特别好用!比如时钟(12小时一圈)、星期(7天一圈),还有我们这道题的月份(12个月一圈)。只要遇到这种循环问题,第一时间就要想到可爱的
%
哦!
- 在代码里就是那个
std::vector
- 这是 C++ 标准库里的一个容器,可以把它想象成一个“可变长度的数组”或者一个“小篮子”。
- 它的优点是:可以按顺序存放一堆东西,并且可以通过下标(比如
months[0]
)快速访问任意一个元素。在本题中,我们用它来存储从 0 到 11 号月份的名字。
std::map
- 这也是 C++ 标准库里的一个容器,就像一个“字典”或者“小本本”。
- 它存放的是一对一的键值对 (key-value pair)。你可以用一个“键 (key)” 去快速查找对应的“值 (value)”。
- 在本题中,我们用月份的英文名(
std::string
)作为键,用它的数字编号(int
)作为值。这样,只要给出月份名,就能O(log n)
的飞快速度找到它的编号,比自己写一长串if-else
判断要优雅多啦!
好啦,这道题的讲解就到这里啦~ 是不是又学到了一些有用的东西呢?主人下次再遇到类似的问题,可要想起本喵的讲解哦!喵~ ❤️