题目链接:请点击
分析:
注1:测试点3易超时,不能每次都从结构体头开始逐一比较学号是否存在。所以,用map下标标识学号,里面存储该学号学生所在结构体的编号。
注2:计算总评需要四舍五入
AC代码
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
struct Stu{
string id;//学号
int gp=-1;//在线编程成绩
int gm=-1;//期中成绩
int gf=-1;//期末成绩
int g;//总评成绩
};
bool cmp(Stu stua,Stu stub){
if(stua.g!=stub.g) return stua.g>stub.g;
else return stua.id<stub.id;
}
int main(){
int P,M,N,k=0;
cin>>P>>M>>N;
Stu stu[P];
map<string,int> stuId;//下标对应学生学号
for(int i=0;i<P;i++){
string sid;int grade;
cin>>sid>>grade;
if(grade>=200){//编程成绩>=200
stuId[sid]=k+1;//标识sid学生存在且编程合格
stu[k].id=sid;
stu[k].gp=grade;
k++;
}
}
for(int i=0;i<M;i++){
int grade;string sid;
cin>>sid>>grade;
if(stuId[sid]) stu[stuId[sid]-1].gm=grade;
}
for(int i=0;i<N;i++){
int grade;string sid;
cin>>sid>>grade;
if(stuId[sid]) stu[stuId[sid]-1].gf=grade;
}
for(int i=0;i<k;i++){
if(stu[i].gm>stu[i].gf){//期中>期末 注意四舍五入
float grade=1.0*stu[i].gm*0.4+1.0*stu[i].gf*0.6;
if(grade-(int)grade>=0.5) stu[i].g=(int)grade+1;
else stu[i].g=(int)grade;
} else stu[i].g=stu[i].gf;
if(stu[i].g<60) stu[i].g=-1;
}
sort(stu,stu+k,cmp);
for(int i=0;i<k;i++){
if(stu[i].g==-1) return 0;
cout<<stu[i].id<<" "<<stu[i].gp<<" "<<stu[i].gm<<" "<<stu[i].gf<<" "<<stu[i].g<<endl;
}
return 0;
}