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