top1编程
← 返回题目
题解

最大最小土地面积

1 条题解

  • 0
    @ 2026-8-5 23:59:33

    P4720 最大最小土地面积(入门)

    解题思路

    第一步:看懂题目。 小镇每年要重新划分土地,镇长需要找出最大的和最小的土地面积。这其实就是一个“找最大值和最小值”的问题,关键要掌握“打擂台”的思路。

    第二步:认识“打擂台”的想法。 我们可以把找最大值想象成一场擂台赛:先把第一块土地的面积当作擂主,第二块土地走上台来挑战,如果它比擂主大,它就当新的擂主,否则擂主不变;接着第三块土地来挑战……这样一轮比完,最后站在台上的擂主一定是所有土地中面积最大的。找最小值也是同样的道理,只是每次比的是“谁更小”。

    第三步:写出代码的要点。 用变量 maxNum 记录当前最大值,变量 minNum 记录当前最小值。开始时,为了让第一块土地一定能“打赢”,把 maxNum 初始化成非常小的数 0(因为题目说每块土地面积至少是 50),把 minNum 初始化成非常大的数 100000(因为面积最大才 10000)。这样读入每一块土地时,就让它和 maxNum、minNum 分别比较并更新。

    第四步:注意边界情况。 如果只有一块土地(n=1),这块土地既是最大的也是最小的,程序输出两个相同的数就可以了。题目保证每块土地面积都不相同,所以不用担心最大值和最小值相同(n=1 时除外)。

    第五步:整体流程。 读入 n 后,用循环依次读入每块土地的面积并更新最大值和最小值,最后输出 maxNum 和 minNum,中间用空格隔开。n 最多 50,数值最大 10000,用 int 类型完全足够。

    参考代码

    // 求所有土地面积中的最大值和最小值
    #include <iostream>
    using namespace std;
    
    int main() {
        int n, num;
        cin >> n;
        int maxNum = 0, minNum = 100000; // maxNum 记录最大值,minNum 记录最小值
        for (int i = 0; i < n; i++) {
            cin >> num;
            if (num > maxNum) maxNum = num; // 挑战擂主,比它大就当新擂主
            if (num < minNum) minNum = num; // 找最小值:谁更小谁当擂主
        }
        cout << maxNum << " " << minNum << endl;
        return 0;
    }
    

    复杂度分析

    程序只需要用一层循环依次处理 n 块土地,每块土地做两次比较(和最大值比、和最小值比),所以时间复杂度是 O(n)。这里 n 最大是 50,运行非常快。程序只用了几个普通的整型变量来存最大值、最小值和当前读入的值,没有使用数组等额外空间,所以空间复杂度是 O(1),即只占用常数大小的内存。

    • 1