题目链接
知识点:排序、unordered_map
思路
1、理清规则,是否具有在线考试成绩,成绩如何计算等
2、设置mp数组将具有考试资格的学生进行排号,并将学生信息放入v中。期中期末成绩先置为-1,总成绩置为0
3、通过mp数组的对应关系,将mp[t]不为0的考生对应的期中期末成绩进行更新,要注意mp[t]=0的同学,有不具备考试资格的同学,也有0号同学,因此加入条件t==v[0].name
代码
#include <bits/stdc++.h>
using namespace std;
struct Node{
string name;
int gp,gm,gn,g;
};
bool cmp(Node a,Node b){return a.g!=b.g?a.g>b.g:a.name<b.name;}
int main()
{
int p,m,n,a,num=0;
string t;
unordered_map<string,int> mp;
vector<Node> v;
scanf("%d %d %d",&p,&m,&n);
for(int i=0;i<p;i++){
cin>>t>>a;
if(a>=200){
mp[t]=num++;
v.push_back({t,a,-1,-1,0});
}
}
for(int i=0;i<m;i++){
cin>>t>>a;
if(mp[t]!=0||t==v[0].name) v[mp[t]].gm=a;
}
for(int i=0;i<n;i++){
cin>>t>>a;
if(mp[t]!=0||t==v[0].name) v[mp[t]].gn=a;
}
for(int i=0;i<v.size();i++){
v[i].g=(v[i].gm>v[i].gn)?(int)(v[i].gm*0.4+v[i].gn*0.6+0.5):v[i].gn;
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size();i++){
if(v[i].g>=60) printf("%s %d %d %d %d\n",v[i].name.c_str(),v[i].gp,v[i].gm,v[i].gn,v[i].g);
}
}
卡住的点
1、unordered_map使用。和map差不多,但是不会消去重复元素
2、题中条件太多,没有理清规则
3、没有想到使用unordered_map进行学生和num之间的对照,导致不知道如何将gm、gn和对应的学生建立联系。