题意:排序题。
思路:通过unordered_map来存储考生姓名与其成绩信息结构体的映射,成绩初始化为-1,在读入数据时更新各个成绩,最后计算最终成绩并把符合条件的学生存入vector,再排序即可。需要注意的是,计算最终成绩时记得"G must be rounded up to an integer"。关于取整函数,总结在这里。
代码:
#include <iostream> #include <string> #include <unordered_map> #include <vector> #include <algorithm> #include <cmath> #include <fstream> using namespace std; struct Student{ string id; int Gp,Gm,Gf,Gtot; Student():id(""),Gp(-1),Gm(-1),Gf(-1),Gtot(0){} }; unordered_map<string,Student> mp; vector<Student> stu; bool cmp(Student a,Student b) { if(a.Gtot!=b.Gtot) return a.Gtot>b.Gtot; else return a.id<b.id; } int main() { //ifstream cin("pat.txt"); int p,m,f; cin>>p>>m>>f; string id; int score; for(int i=0;i<p;i++){ cin>>id>>score; mp[id].id=id; mp[id].Gp=score; } for(int i=0;i<m;i++){ cin>>id>>score; mp[id].id=id; mp[id].Gm=score; } for(int i=0;i<f;i++){ cin>>id>>score; mp[id].id=id; mp[id].Gf=score; } for(auto it:mp){ Student st=it.second; if(st.Gm>st.Gf) st.Gtot=round(st.Gm*0.4+st.Gf*0.6);//注意四舍五入 else st.Gtot=st.Gf; if(st.Gp>=200 && st.Gtot>=60) stu.push_back(st); } sort(stu.begin(),stu.end(),cmp); for(auto it:stu) cout<<it.id<<" "<<it.Gp<<" "<<it.Gm<<" "<<it.Gf<<" "<<it.Gtot<<"\n"; return 0; }
原文地址:https://www.cnblogs.com/kkmjy/p/9570023.html
时间: 2024-10-30 10:37:07