1

题目大意:

给出三个名单表格,分别记录考生的在线编程的成绩、期中成绩和期末成绩;需要计算最终成绩,然后筛选出能够获得证书的名单,并按照最终成绩的降序和ID的升序排列输出。

算法思路:

使用Student保存学生的所有相关信息,然后使用map students记录所有的学生id与学生信息的映射,在输入的时候仅仅保存学生的id和分数就好,无需做任何预处理,然后遍历students,将所有可以获得证书的学生添加进集合qulifiedStudents,具体做法就是对于Gp分数大于等于200的计算其最终成绩,然后使用对于最终成绩大于等于60分的加入qulifiedStudents集合中,然后在对qulifiedStudents集合进行排序输出。

注意点:

  • 1、final grade是最终成绩不是G_final,而且使用最终成绩判断是否大于等于60分的时候一定得是四舍五入后的结果进行的判断,否则测试点3错误。
  • 2、最后初始化所有的成绩为-1,这样没有参加的考生成绩自然就是-1,方便输出。如果是0,不放便分辨是得了0分还是没有参加考试。

提交结果:

image.png

AC代码:

#include<cstdio>
#include<string>
#include<iostream>
#include<unordered_map>
#include<vector>
#include<cmath>
#include<algorithm>

using namespace std;

struct Student{
    string id;
    int Gp,G_mid,G_final,G;
    Student(){
        Gp = G_mid = G_final = G = -1;
    }
};
unordered_map<string,Student> students;
vector<Student> qulifiedStudents;//所有合格的学生 

bool cmp(const Student &a,const Student &b){
    return a.G!=b.G?a.G>b.G:a.id<b.id;
}

int main(){
    int P,M,N;
    scanf("%d %d %d",&P,&M,&N);
    // 输入Gp分数,且一定都是第一次出现
    string id;
    for(int i=0;i<P;++i){
        cin>>id;
        cin>>students[id].Gp;
        students[id].id = id;
    } 
    // 输入G_mid 
    for(int i=0;i<M;++i){
        cin>>id;
        cin>>students[id].G_mid;
        students[id].id = id;
    } 
    // 输入G_final 
    for(int i=0;i<N;++i){
        cin>>id;
        cin>>students[id].G_final;
        students[id].id = id;
    }
    // 遍历所有学生,筛选合格的学生
    unordered_map<string,Student>::iterator it;
    for(it=students.begin();it!=students.end();++it){
        if(it->second.Gp>=200){
            //Gp大于等于200的学生,再计算最终成绩是否是大于等于60
            double G;
            if(it->second.G_mid>it->second.G_final) {
                G = it->second.G_mid*0.4+it->second.G_final*0.6;
            }else{
                G = it->second.G_final;
            }
            it->second.G = (int)round(G);
            if(it->second.G>=60){ // 最终成绩得使用四舍五入的成绩来作为判断条件,不然卡测试点3 
                qulifiedStudents.push_back(it->second);
            }
        }
    }
    sort(qulifiedStudents.begin(),qulifiedStudents.end(),cmp);
    for(auto &item:qulifiedStudents){
        printf("%s %d %d %d %d\n",item.id.c_str(),item.Gp,item.G_mid,item.G_final,item.G);
    }
    return 0;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得