题解:洛谷 P5742 评等级

【题目来源】

洛谷:P5742 【深基7.例11】评等级 - 洛谷(luogu.com.cn)

【题目描述】

现有 \(N\) 名同学,每名同学需要设计一个结构体记录以下信息:学号、学业成绩和素质拓展成绩、综合分数(实数)。每行读入同学的学号、学业成绩和素质拓展成绩,并且计算综合分数(分别按照 \(70\%\)\(30\%\) 权重累加),存入结构体中。还需要在结构体中定义一个成员函数,返回该结构体对象的学业成绩和素质拓展成绩的总分。

然后需要设计一个函数,其参数是一个学生结构体对象,判断该学生是否“优秀”。优秀的定义是学业和素质拓展成绩总分大于 \(140\) 分,且综合分数不小于 \(80\) 分。

本题存在精度误差问题,请将 a * 0.3 + b * 0.7 与 80 比较 转化为 a * 3 + b * 7\(800\) 比较。

【输入】

第一行一个整数 \(N\)

接下来 \(N\) 行,每行 \(3\) 个整数,依次代表学号、学业成绩和素质拓展成绩。

【输出】

\(N\) 行,如果第 \(i\) 名学生是优秀的,输出 Excellent,否则输出 Not excellent

【输入样例】

4
1223 95 59
1224 50 7
1473 32 45
1556 86 99

【输出样例】

Excellent
Not excellent
Not excellent
Excellent

【核心思想】

  1. 问题分析:有 \(N\) 名学生,每名学生有学号、学业成绩和素质拓展成绩。需要计算综合分数(学业成绩占 70%,素质拓展成绩占 30%),并判断是否“优秀”。优秀条件:学业和素质拓展成绩总分 > 140,且综合分数 ≥ 80。为了避免浮点数精度问题,将综合分数的计算和比较转化为整数运算(学业成绩*7 + 素质拓展成绩*3 >= 800)。本质是一个结构体定义与成员函数使用的练习。

  2. 算法选择

    • 结构体封装:定义 Student 结构体,包含学号、学业成绩、素质拓展成绩、综合分数(整数形式)和总分。在结构体内定义成员函数 judge() 用于判断是否优秀。
    • 线性处理:读入每个学生的数据,计算综合分数和总分,然后调用 judge() 输出结果。
    • 复杂度:时间复杂度 \(O(N)\),空间复杂度 \(O(N)\)
  3. 关键步骤

    • 读入与计算:读取 \(N\),对每个学生读入学号、学业成绩 s1、素质拓展成绩 s2
      • 综合分数(整数形式):c1 = s1 * 7 + s2 * 3(对应 70% 和 30% 权重,比较时与 800 比较)。
      • 总分:c2 = s1 + s2
    • 判断优秀:若 c1 >= 800 && c2 > 140,则输出 "Excellent",否则 "Not excellent"
    • 输出:按顺序输出每个学生的评定结果。
  4. 时间/空间复杂度

    • 时间复杂度:\(O(N)\)
    • 空间复杂度:\(O(N)\)
  5. 结构体与成员函数

    • 结构体优势:将数据和操作封装在一起,体现了面向对象的基本思想。
    • 整数化处理:将 a*0.3 + b*0.7 >= 80 转化为 a*3 + b*7 >= 800,避免了浮点数误差,是竞赛中常用的技巧。
    • 严格条件:注意“总分 大于 140”和“综合分数 不小于 80”的边界条件。
    • 适用场景:这类“结构体定义与使用”的题目,适合练习 C++ 结构体和成员函数。

【算法标签】

普及- #模拟

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

// 定义学生结构体
struct student
{
    int id;       // 学号
    int s1;       // 学业成绩
    int s2;       // 素质拓展成绩
    double c1;    // 综合分数(学业成绩×7 + 素质拓展成绩×3)
    int c2;       // 总分(学业成绩 + 素质拓展成绩)

    /**
     * 判断学生是否优秀
     * @return 如果综合分数≥800且总分>140返回true,否则返回false
     */
    bool judge()
    {
        if (c1 >= 800 && c2 > 140)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};

int main()
{
    int n;                // 定义变量:学生数量
    student s[1005];      // 定义学生数组,最多存储1005个学生

    cin >> n;             // 输入学生数量

    // 输入每个学生的信息并计算综合分数和总分
    for (int i = 1; i <= n; i++)
    {
        cin >> s[i].id >> s[i].s1 >> s[i].s2;  // 输入学生信息
        s[i].c1 = s[i].s1 * 7 + s[i].s2 * 3;    // 计算综合分数
        s[i].c2 = s[i].s1 + s[i].s2;            // 计算总分
    }

    // 判断每个学生是否优秀并输出结果
    for (int i = 1; i <= n; i++)
    {
        if (s[i].judge())
        {
            cout << "Excellent" << endl;      // 优秀学生
        }
        else
        {
            cout << "Not excellent" << endl;  // 非优秀学生
        }
    }

    return 0;  // 程序正常结束
}

【运行结果】

4
1223 95 59
1224 50 7
1473 32 45
1556 86 99
Excellent
Not excellent
Not excellent
Excellent
posted @ 2026-09-01 09:26  团爸讲算法  阅读(19)  评论(0)    收藏  举报