题解
身高统计
1 条题解
-
0
解题思路
全班按学号排好队,身高各不一样。我们要找出最高和最矮的同学,然后按学号顺序,输出站在他们两个之间的所有同学的学号和身高(不包括最高和最矮本人)。
做法分两步:
- 找最高和最矮:一边读入身高,一边用两个变量记录“最高同学的位置 mx”和“最矮同学的位置 mn”。如果当前身高比
h[mx]还高就更新 mx,比h[mn]还矮就更新 mn。读完一遍,mx 和 mn 就是最高、最矮同学在队伍里的学号。 - 输出中间的人:最高和最矮不一定谁在前面,所以先取较靠前的学号
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)。
- 找最高和最矮:一边读入身高,一边用两个变量记录“最高同学的位置 mx”和“最矮同学的位置 mn”。如果当前身高比
- 1