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