top1编程
← 返回题目
题解

最少的花生

1 条题解

  • 0
    @ 2026-8-5 0:56:09

    解题思路

    题目要我们找出哪一列的花生总数最少。

    思路分两步:

    1. 算每列的总和:准备一个数组 sum,sum[j] 表示第 j 列的总数。读入时,每个数字在第 j 列,就把它加进 sum[j]。
    2. 找最小的那一列:扫一遍 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