top1编程
← 返回题目
题解

奥运奖牌计数

1 条题解

  • 0
    @ 2026-8-4 14:03:51

    解题思路

    这道题要我们把 n 天里每一天获得的金、银、铜牌数分别累加起来,最后再求出总奖牌数。

    我们用三个“累加器”:gold(金牌总数)、silver(银牌总数)、bronze(铜牌总数)。累加器一开始必须设成 0,因为第一天开始前什么奖牌都还没有获得。

    然后循环 n 次,每次读入一天的三个数 g、s、b,把它们分别累加:

    • gold = gold + g,把今天的金牌数累加进金牌总数;
    • silver = silver + s,累加银牌;
    • bronze = bronze + b,累加铜牌。

    循环结束后,三个累加器里就分别是金、银、铜牌的总数。最后总奖牌数 = 金牌 + 银牌 + 铜牌 = gold + silver + bronze,一行输出 4 个数即可。

    有两个容易出错的地方:

    1. 累加器忘记初始化成 0。不初始化的话,变量里可能是随机值,求和结果就会莫名其妙地出错;
    2. 循环次数写死而不是用读入的 n。本题天数由输入决定,一定要用 n 控制循环次数。

    顺便记一个简写:gold = gold + g 在 C++ 里可以写成 gold += g,意思是“把 g 累加到 gold 上”,写起来更快。

    参考代码

    #include using namespace std;

    int main() { int n; // n 表示决赛的天数 cin >> n; // 读入天数

    int gold = 0, silver = 0, bronze = 0;  // 三个累加器先初始化为 0
    
    for (int i = 1; i <= n; i = i + 1) {   // 循环 n 天
        int g, s, b;           // 今天获得的金、银、铜牌数
        cin >> g >> s >> b;    // 读入今天的数据
        gold += g;             // gold = gold + g,累加金牌
        silver += s;           // 累加银牌
        bronze += b;           // 累加铜牌
    }
    
    cout << gold << " " << silver << " " << bronze << " ";
    cout << gold + silver + bronze << endl;  // 总奖牌数
    return 0;
    

    }

    复杂度分析

    题目中 n 表示决赛天数,最大为 17。循环执行 n 次,每天读入 3 个数并做 3 次加法,一共要处理 3n 个数,所以时间复杂度是 O(n)。程序只用几个 int 变量存放累加结果和当天的数据,不管 n 多大,占用空间都固定,空间复杂度是 O(1)。

    • 1