题解
学生评定
1 条题解
-
0
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