原文链接:我的个人博客
原题链接
考点
结构体;排序
思路
函数sti,用于将学生姓名与自定义的id号进行对应。根据题目输入,初始化任务点、平时分和期末分。最后根据合格的要求(任务点不少于200,最后得分在60-100),将符合要求的学生push_back进入ans中。再根据题目要求,自定义排序规则。最后输出即可。
代码
#include <bits/stdc++.h>
using namespace std;
struct node{
string id;
int Gp,Gm,Gf,G;
node(){
Gp=-1;
Gm=-1;
Gf=-1;
G=-1;
}
};
bool cmp(const node& a,const node& b){
if(a.G!=b.G){
return a.G>b.G;
}else{
return a.id<b.id;
}
}
int p,m,n,score,id=1,num;
map<string,int>has;
int sti(string s){
if(has[s]==0){
has[s]=id;
return id++;
}else{
return has[s];
}
}
int main(){
cin>>p>>m>>n;
string stu;
node nodes[100000];
for(int i=0;i<p;i++){//任务点
cin>>stu>>score;
num = sti(stu);
nodes[num].id = stu;
nodes[num].Gp = score;
}
for(int i=0;i<m;i++){//平时分
cin>>stu>>score;
num = sti(stu);
nodes[num].id = stu;
nodes[num].Gm = score;
}
for(int i=0;i<n;i++){//期末分
cin>>stu>>score;
num = sti(stu);
nodes[num].id = stu;
nodes[num].Gf = score;
}
vector<node> ans;
for(int i=1;i<id;i++){
if(nodes[i].Gm<nodes[i].Gf) nodes[i].G=nodes[i].Gf;
else{
if(nodes[i].Gm==-1) nodes[i].G=nodes[i].Gf;
else nodes[i].G = round(1.0*nodes[i].Gm*0.4+1.0*nodes[i].Gf*0.6);
}
if(nodes[i].Gp>=200&&nodes[i].G>=60&&nodes[i].G<=100){
ans.push_back(nodes[i]);
}
}
sort(ans.begin(),ans.end(),cmp);
for(int i=0;i<ans.size();i++){
cout<<ans[i].id<<' '<<ans[i].Gp<<' '<<ans[i].Gm<<" "<<ans[i].Gf<<' '<<ans[i].G<<endl;
}
}