top1编程
← 返回题目
题解

查询分数3

1 条题解

  • 0
    @ 2026-8-5 0:54:47

    解题思路

    题目分三步走:

    1. 读入并求和:读入 n 和 n 个成绩,一边读一边累加得到总分 sum;
    2. 算平均分:平均分 = 总分 ÷ 人数,也就是 sum / n。因为题目要求只保留整数,直接用整数除法就可以了(C++ 里两个整数相除会自动去掉小数部分);
    3. 找超过平均分的学生:再遍历一遍,谁的分数 > 平均分,就输出它的学号(学号从 1 开始)。

    输出学号时要注意空格:多个学号之间用空格隔开,但开头不能有空格、结尾也不能多一个空格。我们用 first 这个标志记录“是不是第一个要输出的学号”,第一个前面不加空格,后面的每个学号前面加一个空格。

    参考代码

    // P4449 查询分数3:算平均分,再输出超过平均分的学生学号
    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;               // 学生人数
        int a[105];
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            cin >> a[i];        // 读入每个学生的成绩,学号 i 从 1 开始
            sum += a[i];        // 累加总分
        }
        int avg = sum / n;      // 平均分 = 总分 / 人数,只保留整数部分
        cout << avg << endl;
        // 依次检查每个学生,分数大于平均分就输出学号
        bool first = true;      // 控制空格:第一个数前不加空格
        for (int i = 1; i <= n; i++) {
            if (a[i] > avg) {
                if (!first) cout << " ";
                cout << i;
                first = false;
            }
        }
        cout << endl;
        return 0;
    }
    

    复杂度分析

    设有 n 名学生。

    • 时间:第一遍读入并求和,第二遍找超过平均分的学生,共两遍循环,时间复杂度是 O(n)。
    • 空间:需要一个能装 n 个成绩的数组,空间复杂度是 O(n)。
    • 1