第一遍没有仔细看题目,题干中提到的最终成绩不小于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;
}