top1编程
← 返回题目
题解

学生评定

1 条题解

  • 0
    @ 2026-8-5 22:12:18

    P4626 学生评定(入门)

    解题思路

    这道题要根据综合分数判断每位同学是不是优秀学生。综合分数 = 7 × 学业成绩 + 3 × 素质拓展成绩。读入所有学生的学号和两项成绩后,还要读入最后一个整数——学校的优秀学生分数线。综合分数大于等于分数线的输出 Excellent,否则输出 Not excellent。

    要注意两点:第一,分数线在最后一行,所以要先把所有学生信息存起来,再读分数线,最后统一输出,不能一边读一边判;第二,题目没有明确给出 N 的范围,实际测试数据可能有几千人,所以数组要开大一些(100005),并且放在静态区避免栈溢出,否则数组越界会破坏其他变量,导致判断出错。

    举一个具体的例子:学业 95、素质 59 的学生,综合分数是 7×95+3×59=842,分数线是 617,842 大于等于 617,输出 Excellent;学业 50、素质 7 的学生,综合分数是 7×50+3×7=371,小于 617,输出 Not excellent。成绩范围不超过 100,综合分数最大 1000,用 int 足够。注意“达到分数线”用的是大于等于,刚好等于分数线的同学也是优秀学生。

    参考代码

    // 用途:根据综合分数判断每名学生是否为优秀学生。
    #include <iostream>
    using namespace std;
    
    struct Student {
        int id;             // 学生的学号
        int total;          // 学生的综合分数
    };
    
    int main() {
        int n;                              // 学生人数
        cin >> n;                           // 读入学生人数
        static Student a[100005];           // 保存所有学生信息,N最大可达5000以上
    
        for (int i = 0; i < n; i++) {       // 依次处理每名学生
            int study;                      // 学业成绩
            int quality;                    // 素质拓展成绩
            cin >> a[i].id >> study >> quality; // 读入学号和两项成绩
            a[i].total = 7 * study + 3 * quality; // 按公式计算综合分数
        }
    
        int line;                           // 学校的优秀学生分数线
        cin >> line;                        // 读入分数线
        for (int i = 0; i < n; i++) {       // 依次输出每名学生的评定
            cout << a[i].id << ' ';          // 输出学号
            if (a[i].total >= line) {        // 综合分数达到分数线就是优秀
                cout << "Excellent";
            } else {                         // 没有达到分数线就不是优秀
                cout << "Not excellent";
            }
            cout << '\n';                    // 换行输出下一名学生
        }
        return 0;                           // 程序结束
    }
    

    复杂度分析

    程序读入一遍、输出一遍,时间复杂度 O(N),N 最大几千,非常快。空间 O(N)。输出每个结果后要换行,格式是学号加一个空格加结果,例如 1223 Excellent。综合分数公式里的乘号不能漏,7 倍学业成绩和 3 倍素质成绩缺一不可,两个系数写反了也会导致判断错误。

    • 1