思路:结构体排序输出即可,我使用的是id和下标的映射
易错点:
1.G的计算式四舍五入,使用round函数,而ceil函数是向上取整
2.输出条件是stu[i].G>=60&&stu[i].p>=200
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
struct Stu{
string id;
int p =-1,mid=-1 ,Gfinal=-1, G=-1;
};
int index=0;
map<string,int> id_index;
map<int,string>index_id;
struct Stu stu[30005];
bool cmp(Stu& a,Stu& b){
return a.G==b.G?a.id<b.id:a.G>b.G;
}
int p,m,n;//P,完成在线编程作业的学生人数;M,期中考试名单上的学生人数;N,期末考试名单上的学生人数。所有数字都不超过10000。
int main(){
cin>>p>>m>>n;
for(int i=0;i<p;i++){//在线编程成绩 p
string id;
int score;
cin>>id>>score;
if(id_index.count(id)){
stu[id_index[id]].p=score;
}
else{
id_index[id]=index;
index_id[index]=id;
stu[index].id=id;
stu[index].p=score;
index++;
}
}
for(int i=0;i<m;i++){
string id;
int score;
cin>>id>>score;
if(id_index.count(id)){
stu[id_index[id]].mid=score;
}
else{
id_index[id]=index;
index_id[index]=id;
stu[index].mid=score;
stu[index].id=id;
index++;
}
}
for(int i=0;i<n;i++){
string id;
int score;
cin>>id>>score;
if(id_index.count(id)){
stu[id_index[id]].Gfinal=score;
}
else{
id_index[id]=index;
index_id[index]=id;
index++;
stu[id_index[id]].Gfinal=score;
}
}
//排序
for(int i=0;i<index;i++){
if(stu[i].mid<stu[i].Gfinal) stu[i].G=stu[i].Gfinal;
else if(stu[i].Gfinal!=-1){
stu[i].G=round(0.4*stu[i].mid + 0.6*stu[i].Gfinal);
}
}
sort(stu,stu+index,cmp);
//输出 StudentID G_p在线编程分数 G_mid-term G_final G
for(int i=0;i<index;i++){
if(stu[i].G>=60&&stu[i].p>=200)
cout<<stu[i].id<<" "<<stu[i].p<<" "<<stu[i].mid<<" "<<stu[i].Gfinal<<" "<<stu[i].G<<endl;
}
return 0;
}