题解
收花生
1 条题解
-
0
解题思路
这是一道非常简单的“二维数组求和”题。
1. 题意
花生地是一个 m×n 的二维数组,每个格子里有一棵花生树,格子里写的数字就是这棵树结的花生数。小程想知道一共能收获多少花生——也就是把数组里所有数字加起来。
2. 怎么求?
用双重循环,把 m 行、每行 n 个数字全部读进来,一个一个加到 sum 里,最后输出 sum。
3. 大坑:会不会溢出?
花生数最大可能到 10 亿,而 m、n 最大是 100,也就是最多有 10000 棵树。万一每棵都结很多,总和可能超过 21 亿(int 能表示的最大值),用 int 会出错!
所以 sum 一定要用 long long(64 位整数,能表示的最大值大约 9 后面跟 18 个 0),读进来的数字也用 long long,这样就绝对安全了。
4. 对照样例
样例里所有数字加起来是 1+2+3+1+2+1+3+3+2+2+2+2=24,输出 24。
参考代码
#include <iostream> using namespace std; int main(){ // P4528 收花生:把二维数组里的所有数加起来就是收获的花生总数 int m, n; cin >> m >> n; long long sum = 0; // 累加器用 long long,防止大数字求和时溢出 for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ long long x; cin >> x; sum += x; // 每棵花生树上的花生都加进来 } } cout << sum << endl; return 0; }复杂度分析
数组一共有 m×n 个数,每个数都要读一遍并加一次,所以时间复杂度是 O(m×n)。题目说 3 ≤ m,n ≤ 100,最多 10000 个数,非常快。
程序只用了几个变量,没有开数组,空间复杂度是 O(1)。
- 1