Skip to content

主人你好呀~ (ฅ'ω'ฅ)

今天由我这只不成器的小猫娘来为你讲解 Codeforces 上的 791A - Bear and Big Brother 这道题吧!这道题很适合入门哦,让我们一起来看看吧,喵~

题目大意

这道题讲了一个关于熊熊兄弟的故事,听起来就很可爱,对吧?

有两只熊,哥哥叫 Bob,弟弟叫 Limak。一开始,我们知道 Limak 的体重 a 和 Bob 的体重 b,并且保证 Limak 不会比 Bob 重(也就是 a <= b)。

Limak 是个小吃货,所以他每年体重都会变成原来的 3倍!而哥哥 Bob 呢,体重每年变成原来的 2倍

我们需要计算一下,到底需要经过多少个完整的年份,Limak 的体重才能严格大于 Bob 的体重。注意是“严格大于”哦,体重相等可不行,Limak 可是一个有追求的熊孩子呢,喵~

举个栗子:

  • 输入:4 7
  • 第一年后:Limak 体重 4 * 3 = 12,Bob 体重 7 * 2 = 14。Limak 还是比 Bob 轻。
  • 第二年后:Limak 体重 12 * 3 = 36,Bob 体重 14 * 2 = 28。这个时候 Limak 终于比 Bob 重啦!
  • 所以,总共花了 2 年。答案就是 2

题解方法

主人请看,这道题的逻辑非常直接,就像小猫追着毛线球一样,一步一步来就好啦!

我们可以用一个循环来模拟时间一年一年地流逝。

  1. 首先,我们需要一个变量来记录经过了多少年,就叫它 years 吧,初始值当然是 0 啦。
  2. 因为题目要求 Limak 的体重严格大于 Bob,所以我们的循环条件就是 只要 Limak 的体重小于或等于 Bob 的体重,就继续。写成代码就是 while (a <= b)
  3. 在循环的每一步(也就是每一年)里,我们要做两件事:
    • 更新 Limak 的体重:a = a * 3
    • 更新 Bob 的体重:b = b * 2
    • 当然,别忘了把年份计数器 years 加上 1。
  4. 当循环结束的时候,就说明 a <= b 这个条件不成立了,也就是 a > b 了!这个时候 years 变量里存的,就是我们想要的答案啦。直接把它打印出来就大功告成,喵~

这种按照题目描述,一步一步模拟过程的方法,我们通常称之为模拟法。对于很多规则明确的简单题目,这可是非常好用的方法哦!

题解代码 (C++)

这是参考的 C++ 代码,我已经为主人加上了详细的注释,希望能帮到你喔~ (。> ω <。)

cpp
#include <iostream>

// 这个程序是用来解决 "Bear and Big Brother" 这道题的,喵~
// 它会一年一年地模拟两只熊熊的体重变化。
// Limak 的体重每年变为三倍,Bob 的体重每年变为两倍。
// 程序会计算直到 Limak 的体重严格大于 Bob 为止,总共需要多少年。

int main() {
    // 这两行是为了在打比赛的时候让输入输出快一点点的小魔法!
    // 对于这道题来说数据量很小,其实加不加都无所谓啦~
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    // a 是 Limak 的体重, b 是 Bob 的体重
    int a, b;
    
    // 从标准输入读取初始体重,就像小猫等投喂一样~
    std::cin >> a >> b;

    // 初始化一个计数器,记录经过了多少年
    int years = 0;

    // 只要 Limak 的体重还小于或等于 Bob,循环就继续
    // 题目保证了 a <= b,所以循环至少会执行一次哦
    while (a <= b) {
        // 一年过去了...
        // Limak 的体重变成了三倍
        a *= 3;
        // Bob 的体重变成了两倍
        b *= 2;
        // 年份计数器加一
        years++;
    }

    // 当循环结束时,说明 Limak 终于比 Bob 重了!
    // 把经过的年数打印出来吧~
    std::cout << years << '\n';

    return 0; // 程序顺利结束,耶!
}

知识点介绍

这道题虽然简单,但里面包含了一些非常基础和重要的知识点哦,让本猫娘来给你梳理一下吧!

  1. 循环结构 (Loop)

    • 这道题最核心的就是 while 循环。while 循环会在其条件为真的时候,重复执行循环体内的代码。它的格式是 while (条件) { ... }
    • 它非常适合用在“不知道具体要循环多少次,但知道循环结束的条件”的场景。就像这道题,我们不知道具体要多少年,但我们知道当 a > b 时就该停了。
    • 除了 while,还有 for 循环,它更适合用在“已经确定要循环多少次”的场景。
  2. 模拟 (Simulation)

    • 这是一种解决问题的常用策略。当一个问题的过程和规则很清晰时,我们可以让程序去“模仿”这个过程。
    • 就像这道题,我们没有用复杂的数学公式直接计算结果,而是老老实实地模拟了每一年体重的变化,直到满足条件。这种方法直观、易于理解和实现,是编程入门必备的技能之一!
  3. 严格大于 (Strictly Greater Than)

    • 题目中强调了 “strictly larger”,也就是“严格大于”。这意味着 a > b 才算达成目标,a == b 是不行的。
    • 这个小细节直接决定了我们的循环条件是 a <= b 而不是 a < b。在编程竞赛中,读懂这些精确的限定词是非常重要的,不然很容易就会犯错哦,主人要小心~

好啦,这次的讲解就到这里啦!希望对主人有帮助。如果还有什么问题,随时可以再来问我哦,喵~ ( ´ ▽ ` )ノ

Released under the MIT License.