top1编程
← 返回题目
题解

身高统计

1 条题解

  • 0
    @ 2026-8-5 1:30:41

    解题思路

    全班按学号排好队,身高各不一样。我们要找出最高和最矮的同学,然后按学号顺序,输出站在他们两个之间的所有同学的学号和身高(不包括最高和最矮本人)。

    做法分两步:

    1. 找最高和最矮:一边读入身高,一边用两个变量记录“最高同学的位置 mx”和“最矮同学的位置 mn”。如果当前身高比 h[mx] 还高就更新 mx,比 h[mn] 还矮就更新 mn。读完一遍,mx 和 mn 就是最高、最矮同学在队伍里的学号。
    2. 输出中间的人:最高和最矮不一定谁在前面,所以先取较靠前的学号 l = min(mx, mn),较靠后的学号 r = max(mx, mn),然后从学号 l+1 一直输出到学号 r-1,每行输出学号和身高。

    用样例验证:最高 160 在第 3 位,最矮 111 在第 6 位,中间是第 4、5 位,输出 4 154 和 5 144,和样例一致。

    参考代码

    // P4495 身高统计:找出最高和最矮的同学,按学号顺序输出他们之间的所有学生的学号和身高
    #include <iostream>
    using namespace std;
    int h[105];
    
    int main() {
        int n;
        cin >> n;                  // 读入学生人数
        int mx = 1, mn = 1;        // mx 记录最高同学位置,mn 记录最矮同学位置
        for (int i = 1; i <= n; i++) {
            cin >> h[i];           // 读入每个学生的身高
            if (h[i] > h[mx]) mx = i;   // 更新最高
            if (h[i] < h[mn]) mn = i;   // 更新最矮
        }
        int l = mx < mn ? mx : mn; // l 是最高、最矮中较靠前的学号
        int r = mx > mn ? mx : mn; // r 是最高、最矮中较靠后的学号
        // 输出 l 和 r 之间的所有学生(不包含最高最矮本人)
        for (int i = l + 1; i < r; i++) cout << i << ' ' << h[i] << '\n';
        return 0;
    }
    

    复杂度分析

    • 读入身高并找最高最矮,扫一遍 n 个学生:O(n)。
    • 输出中间的学生,最多输出 n-2 个:O(n)。

    总时间复杂度 O(n),空间复杂度 O(n)。

    • 1