关于算法-数据结构:PAT甲级1137-Final-Grading

32次阅读

共计 1732 个字符,预计需要花费 5 分钟才能阅读完成。

题目粗心:

给出三个名单表格,别离记录考生的在线编程的问题、期中问题和期末问题;须要计算最终问题,而后筛选出可能取得证书的名单,
并依照最终问题的降序和 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 分还是没有参加考试。

提交后果:

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;
}

正文完
 0