1137 Final Grading (25分)

tech2025-08-09  2

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

最新回复(0)