用了一个map在读取Gp的时候进行id和标号的对应,之后两组数据如果这个id没读取过Gp就直接continue(continue之前把数据输入做了,不然会错位)
计算最终成绩的时候题目实际要求四舍五入,用一下round(double(x)); (相应还有floor和ceil,都应该熟练)
sort配合cmp是神器,也应熟练使用。
#include<iostream>
#include<vector>
#include<unordered_map>
#include<cmath>
#include<algorithm>
using namespace std;
struct node{
string id;
int Gp=-1,Gm=-1,Gf=-1,G=-1;
};
unordered_map<string,int> id_tag;
bool cmp(const node a,const node b){
if(a.G==b.G){
return a.id<b.id;
}else{
return a.G>b.G;
}
}
int P,M,N;
int main(){
cin>>P>>M>>N;
vector<node> Node(10000);
for(int i=0;i<P;i++){
cin>>Node[i].id>>Node[i].Gp;
id_tag[Node[i].id]=i;
}
for(int i=0;i<M;i++){
string x;
int mid;
cin>>x>>mid;
if(id_tag.find(x)==id_tag.end()) continue;
Node[id_tag[x]].Gm=mid;
}
for(int i=0;i<N;i++){
string x;
int final;
cin>>x>>final;
if(id_tag.find(x)==id_tag.end()) continue;
int index=id_tag[x];
Node[index].Gf=final;
if(Node[index].Gm>Node[index].Gf){
Node[index].G=(int)round(Node[index].Gf*0.6+Node[index].Gm*0.4);
}else{
Node[index].G=Node[index].Gf;
}
}
sort(Node.begin(),Node.end(),cmp);
for(int i=0;i<id_tag.size();i++){
if(Node[i].Gp>=200&&Node[i].G>=60){
cout<<Node[i].id<<" "<<Node[i].Gp<<" "<<Node[i].Gm<<" "<<Node[i].Gf<<" "<<Node[i].G<<endl;
}
}
return 0;
}