题目链接 知识点:排序、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和对应的学生建立联系。