Skip to content

喵哈喽~ 主人你好呀!今天本喵要给你讲解一道超级可爱的入门题:Codeforces 45A - Codecraft III。这道题就像数猫爪一样简单,我们一起来看看吧!喵~

题目大意

这道题是说呀,有一个叫 Vasya 的人,他知道他最喜欢的游戏《Codecraft III》将在 k 个月后发布。他还知道现在的月份是 s。他想请你帮忙算一算,游戏到底会在几月份发布呢?

输入会给你两行:

  1. 第一行是当前月份的英文名(比如 "November")。
  2. 第二行是一个整数 k(0 ≤ k ≤ 100),表示需要等待的月数。

你的任务就是输出 k 个月后的月份的英文名。

举个栗子🌰: 如果现在是 November(十一月),要等 3 个月。 那我们数一下:

  1. 过 1 个月是 December(十二月)
  2. 过 2 个月是 January(一月)
  3. 过 3 个月是 February(二月)

所以答案就是 February 啦!是不是很简单呢?喵~

题解方法

解决这个问题最直接的办法,就是把月份和数字联系起来!计算机可不像我们一样能直接理解 "November" 后面是 "December",但它们处理数字可快了!

所以我们的思路是:

  1. 月份数字化:我们先把 12 个月份排个队,从 0 开始编号。比如 January 是 0,February 是 1,...,December 是 11。
  2. 找到当前月份的数字:读入给定的月份字符串 s,然后找到它对应的数字编号。
  3. 计算未来月份的数字:用当前月份的数字加上要等待的月数 k
  4. 处理年份循环:月份是 12 个月一循环的,就像一个时钟。所以,当我们把当前月份的数字加上 k 之后,需要对 12 取余数(也就是做模运算)。这样,即使结果超过 11,也能正确地绕回到年初。公式就是:(当前月份编号 + k) % 12
  5. 数字转回月份:最后,把计算出的新数字再转换回对应的月份英文名,然后输出就好啦!

这个方法是不是很清晰呀?喵呜~

题解代码

这是 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;
}

知识点介绍

这道题虽然简单,但用到的工具可是很有用的哦!

  1. 模运算 (Modulo Operation)

    • 在代码里就是那个 % 符号啦。a % n 的意思是计算 a 除以 n 的余数。
    • 模运算在处理周期性循环性的问题时特别好用!比如时钟(12小时一圈)、星期(7天一圈),还有我们这道题的月份(12个月一圈)。只要遇到这种循环问题,第一时间就要想到可爱的 % 哦!
  2. std::vector

    • 这是 C++ 标准库里的一个容器,可以把它想象成一个“可变长度的数组”或者一个“小篮子”。
    • 它的优点是:可以按顺序存放一堆东西,并且可以通过下标(比如 months[0])快速访问任意一个元素。在本题中,我们用它来存储从 0 到 11 号月份的名字。
  3. std::map

    • 这也是 C++ 标准库里的一个容器,就像一个“字典”或者“小本本”。
    • 它存放的是一对一的键值对 (key-value pair)。你可以用一个“键 (key)” 去快速查找对应的“值 (value)”。
    • 在本题中,我们用月份的英文名(std::string)作为键,用它的数字编号(int)作为值。这样,只要给出月份名,就能 O(log n) 的飞快速度找到它的编号,比自己写一长串 if-else 判断要优雅多啦!

好啦,这道题的讲解就到这里啦~ 是不是又学到了一些有用的东西呢?主人下次再遇到类似的问题,可要想起本喵的讲解哦!喵~ ❤️

Released under the MIT License.