题解:洛谷 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
【核心思想】
-
问题分析:有 \(N\) 名学生,每名学生有学号、学业成绩和素质拓展成绩。需要计算综合分数(学业成绩占 70%,素质拓展成绩占 30%),并判断是否“优秀”。优秀条件:学业和素质拓展成绩总分 > 140,且综合分数 ≥ 80。为了避免浮点数精度问题,将综合分数的计算和比较转化为整数运算(
学业成绩*7 + 素质拓展成绩*3 >= 800)。本质是一个结构体定义与成员函数使用的练习。 -
算法选择:
- 结构体封装:定义
Student结构体,包含学号、学业成绩、素质拓展成绩、综合分数(整数形式)和总分。在结构体内定义成员函数judge()用于判断是否优秀。 - 线性处理:读入每个学生的数据,计算综合分数和总分,然后调用
judge()输出结果。 - 复杂度:时间复杂度 \(O(N)\),空间复杂度 \(O(N)\)。
- 结构体封装:定义
-
关键步骤:
- 读入与计算:读取 \(N\),对每个学生读入学号、学业成绩
s1、素质拓展成绩s2。- 综合分数(整数形式):
c1 = s1 * 7 + s2 * 3(对应 70% 和 30% 权重,比较时与 800 比较)。 - 总分:
c2 = s1 + s2。
- 综合分数(整数形式):
- 判断优秀:若
c1 >= 800 && c2 > 140,则输出"Excellent",否则"Not excellent"。 - 输出:按顺序输出每个学生的评定结果。
- 读入与计算:读取 \(N\),对每个学生读入学号、学业成绩
-
时间/空间复杂度:
- 时间复杂度:\(O(N)\)。
- 空间复杂度:\(O(N)\)。
-
结构体与成员函数:
- 结构体优势:将数据和操作封装在一起,体现了面向对象的基本思想。
- 整数化处理:将
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
浙公网安备 33010602011771号