第一遍没有仔细看题目,题干中提到的最终成绩不小于60,不是指Gfinal不小于60,而是计算后的G不小于60,卡了好久了,半天没看出哪里问题,final grade 和Gfinal太误导人了
怪自己太菜了≡(▔﹏▔)≡,下面是AC代码
#include<iostream> #include<vector> #include<cstdio> #include<algorithm> #include<unordered_map> using namespace std; struct student{//最终分数向上取整 string id; int gp,gmid,gfinal; int gg; student(){gmid=-1;gfinal=-1;} }st[10005]; //有个特别大的坑,最终成绩大于60,指的是G,而不是Gfinal unordered_map<string,int> sti;//学生id到数组下标的映射 int cnt=1; bool cmp(int a,int b) { if(st[a].gg!=st[b].gg)return st[a].gg>st[b].gg; else return st[a].id<st[b].id; } int main() { int p,m,n; cin>>p>>m>>n; for(int i=0;i<p;i++) { string id; int grade; cin>>id>>grade; if(grade>=200)//合格成绩 { sti[id]=cnt++; st[sti[id]].id=id; st[sti[id]].gp=grade; } } for(int i=0;i<m;i++) { string id;int grade; cin>>id>>grade; if(sti[id]!=0)//存在合格的gp成绩 { st[sti[id]].gmid=grade; } } for(int i=0;i<n;i++) { string id;int grade; cin>>id>>grade; if(sti[id]!=0) { st[sti[id]].gfinal=grade; } } vector<int> result; for(unordered_map<string,int>::iterator it=sti.begin();it!=sti.end();it++) { if(it->second!=0) { int tem=it->second; if(st[tem].gmid>st[tem].gfinal)st[tem].gg=(st[tem].gmid*0.4+st[tem].gfinal*0.6+0.5); else st[tem].gg=st[tem].gfinal; if(st[tem].gg>=60) result.push_back(it->second); } } sort(result.begin(),result.end(),cmp); for(int i=0;i<result.size();i++) { cout<<st[result[i]].id<<" "<<st[result[i]].gp<<" "<<st[result[i]].gmid<<" "; cout<<st[result[i]].gfinal<<" "<<st[result[i]].gg<<endl; } return 0; }