题解
最少的花生
1 条题解
-
0
解题思路
题目要我们找出哪一列的花生总数最少。
思路分两步:
- 算每列的总和:准备一个数组 sum,sum[j] 表示第 j 列的总数。读入时,每个数字在第 j 列,就把它加进 sum[j]。
- 找最小的那一列:扫一遍 sum,记录最小值和它对应的列号。
注意题目有个小陷阱:如果有好几列的总数并列最小,要输出列号最小的那一列。怎么做到?我们在找最小值的时候,只用“比当前记录更小”才更新。遇到相等的情况不更新,那么记录下来的永远是列号最小的那一个。
输出时先输出列号,再输出该列的总和,中间用空格隔开。
参考代码
// P4455 最少的花生:累加每一列的花生总数,找出总和最小的列(并列取列号小) #include <iostream> using namespace std; int sum[105]; // sum[j] 表示第j列的花生总数 int main() { int m, n, x; cin >> m >> n; for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) { cin >> x; sum[j] += x; // 加到第j列的总数上 } int mi = 1; // 花生最少的列,先假设第1列 for (int j = 2; j <= n; j++) if (sum[j] < sum[mi]) mi = j; // 找到更小的就更新(相等时不更新,保证列号最小) cout << mi << " " << sum[mi] << endl; return 0; }复杂度分析
- 读入 m×n 个数做累加,再扫一遍 n 列找最小值,时间复杂度是 O(m × n)。
- 用了一个长度为 n 的数组,空间复杂度是 O(n)。
- 1