-
题目大意:计算每个学生的最终成绩(注意最后的总分是四舍五入得到的整数),判断学生是否能获得证书,获得证书标准为:
- 在线编程任务得分 >= 200
- 60 <= 最终成绩 <= 100(若期末成绩 >= 期中成绩,只考虑期末成绩;否则就以40%期中和60%期末的和算)
- 若满足上述条件,该学生就能拿到证书。并且按照最终成绩(四舍五入的整数)降序输出,若成绩相同,则按id升序输出
-
思路:
- 用map(字符串)存每个人的三个成绩;
- 判断每个人的编程得分是否达标,若达标,再判断他们的期中成绩和期末成绩大小(即只存编程得分达标的),计算最终成绩(四舍五入);
- 用unordered_map存符合条件的学生,存最终成绩时记得四舍五入,最后将最后成绩放入数组,降序输出学生的各个成绩;
-
知识点:
- 结构体
- map
- unordered_map
- 四舍五入:round()
- sort,cmp
-
代码:
#include <iostream> #include <map> #include <unordered_map> #include <string> #include <vector> #include <cmath> #include <algorithm> using namespace std; struct stu{ string name; // 忘记加了,应该和类一样严谨 int points, mid = -1, final = -1; int grade; }; bool cmp(stu a, stu b){ // 读题失误,没注意“如果成绩相同按名字升序排序” return a.grade != b.grade ? a.grade > b.grade : a.name < b.name; } int main(){ int p, m, n, score; string name; map<string, stu> m1; unordered_map<string, stu> q; vector<stu> g; // 用vector方便排序 cin >> p >> m >> n; for(int i = 0; i < p; i++){ cin >> name >> score; if(score >= 200) m1[name].points = score; } for(int i = 0; i < m; i++){ cin >> name >> score; if(m1[name].points != 0) m1[name].mid = score; } for(int i = 0; i < n; i++){ cin >> name >> score; if(m1[name].points != 0) m1[name].final = score; } for(auto it = m1.begin(); it != m1.end(); it++) if((it -> second).points != 0){ // 符合条件的 float grade = 0.0; if((it -> second).final >= (it -> second).mid) grade = round((it -> second).final); else grade = round((it -> second).mid * 0.4 + (it -> second).final * 0.6); if(grade >= 60 && grade <= 100){ q[it->first].name = it->first; q[it->first].points = (it -> second).points; q[it->first].mid = (it -> second).mid; q[it->first].final = (it -> second).final; q[it->first].grade = grade; } } for(auto it = q.begin(); it != q.end(); it++) g.push_back(it->second); sort(g.begin(), g.end(), cmp); for(auto it = g.begin(); it != g.end(); it++) printf("%s %d %d %d %d\n", (*it).name.c_str(), (*it).points, (*it).mid, (*it).final, (*it).grade); return 0; }
-
总结
-
仔细读题!,这次没看到“若成绩相同,则按id升序输出”,所以输出结果有错;
-
如果一个东西有多个属性,就用结构体;
-
要排序的东西可以放到数组里。
-
以后多用三目运算符,可以减少代码量。
-
结构体的元素可以用
{}
表示;struct stu{ string name; int age; int sex; }; int main(){ stu student1 = {"Lily", 10, 1}; stu student2 = stu{"Tom", 11, 0}; // 也可在打括号前写结构体名字 return 0; }
-
unordered_map
:map
会自动排序,若不需排序,可用unordered_map
减少运算时间。 -
四舍五入:
round()
-
需
#include <cmath>
-
round(x)
返回x的四舍五入整数值。 -
ceil(x)
返回不小于x的最小整数值(然后转换为double型)。 -
floor(x)
返回不大于x的最大整数值。
-
-
【PAT】1137. Final Grading (25)
最新推荐文章于 2021-09-18 14:54:03 发布