【PAT】1137. Final Grading (25)

46 篇文章 0 订阅
44 篇文章 0 订阅
  • 题目大意:计算每个学生的最终成绩(注意最后的总分是四舍五入得到的整数),判断学生是否能获得证书,获得证书标准为:

    1. 在线编程任务得分 >= 200
    2. 60 <= 最终成绩 <= 100(若期末成绩 >= 期中成绩,只考虑期末成绩;否则就以40%期中和60%期末的和算)
    3. 若满足上述条件,该学生就能拿到证书。并且按照最终成绩(四舍五入的整数)降序输出,若成绩相同,则按id升序输出
  • 思路:

    1. 用map(字符串)存每个人的三个成绩;
    2. 判断每个人的编程得分是否达标,若达标,再判断他们的期中成绩和期末成绩大小(即只存编程得分达标的),计算最终成绩(四舍五入);
    3. 用unordered_map存符合条件的学生,存最终成绩时记得四舍五入,最后将最后成绩放入数组,降序输出学生的各个成绩;
  • 知识点:

    1. 结构体
    2. map
    3. unordered_map
    4. 四舍五入:round()
    5. 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;
    }
    
  • 总结

    1. 仔细读题!,这次没看到“若成绩相同,则按id升序输出”,所以输出结果有错;

    2. 如果一个东西有多个属性,就用结构体

    3. 要排序的东西可以放到数组里

    4. 以后多用三目运算符,可以减少代码量。

    5. 结构体的元素可以用{}表示;

      struct stu{
          string name;
          int age;
          int sex;
      };
      int main(){
          stu student1 = {"Lily", 10, 1};
      	stu student2 = stu{"Tom", 11, 0};	// 也可在打括号前写结构体名字
          return 0;
      }
      
    6. unordered_mapmap会自动排序,若不需排序,可用 unordered_map减少运算时间。

    7. 四舍五入:round()

      • #include <cmath>

      • round(x)返回x的四舍五入整数值。

      • ceil(x)返回不小于x的最小整数值(然后转换为double型)。

      • floor(x)返回不大于x的最大整数值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值