题解
奥运奖牌计数
1 条题解
-
0
解题思路
这道题要我们把 n 天里每一天获得的金、银、铜牌数分别累加起来,最后再求出总奖牌数。
我们用三个“累加器”:gold(金牌总数)、silver(银牌总数)、bronze(铜牌总数)。累加器一开始必须设成 0,因为第一天开始前什么奖牌都还没有获得。
然后循环 n 次,每次读入一天的三个数 g、s、b,把它们分别累加:
- gold = gold + g,把今天的金牌数累加进金牌总数;
- silver = silver + s,累加银牌;
- bronze = bronze + b,累加铜牌。
循环结束后,三个累加器里就分别是金、银、铜牌的总数。最后总奖牌数 = 金牌 + 银牌 + 铜牌 = gold + silver + bronze,一行输出 4 个数即可。
有两个容易出错的地方:
- 累加器忘记初始化成 0。不初始化的话,变量里可能是随机值,求和结果就会莫名其妙地出错;
- 循环次数写死而不是用读入的 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