每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。
输入第一行给出一个正整数 N(≤),即考生人数。随后 N 行,每行按下列格式给出一个考生的信息:
准考证号 得分 学校
其中准考证号
是由 6 个字符组成的字符串,其首字母表示考试的级别:B
代表乙级,A
代表甲级,T
代表顶级;得分
是 [0, 100] 区间内的整数;学校
是由不超过 6 个英文字母组成的单位码(大小写无关)。注意:题目保证每个考生的准考证号是不同的。
首先在一行中输出单位个数。随后按以下格式非降序输出单位的排行榜:
排名 学校 加权总分 考生人数
其中排名
是该单位的排名(从 1 开始);学校
是全部按小写字母输出的单位码;加权总分
定义为乙级总分/1.5 + 甲级总分 + 顶级总分*1.5
的整数部分;考生人数
是该属于单位的考生的总人数。
学校首先按加权总分排行。如有并列,则应对应相同的排名,并按考生人数升序输出。如果仍然并列,则按单位码的字典序输出。
10
A57908 85 Au
B57908 54 LanX
A37487 60 au
T28374 67 CMU
T32486 24 hypu
A66734 92 cmu
B76378 71 AU
A47780 45 lanx
A72809 100 pku
A03274 45 hypu
5 1 cmu 192 2 1 au 192 3 3 pku 100 1 4 hypu 81 2 4 lanx 81 2
排序一定要记住精度问题,最后一个3分的精度,可以使用toInt这个方式进行解决,先强转为Int,再进行比较,由于数据是double型,所以转回去即可。一定要去零头
#include <iostream> #include <vector> #include <unordered_map> #include <algorithm> using namespace std; struct school{ double grade=0.0; int coun=0; }; void toInt(pair<string,school>& p1){ int tmp=(int)p1.second.grade; p1.second.grade=(double)tmp; } bool cmp(const pair<string,school>& p1,const pair<string,school>& p2){ if(p1.second.grade!=p2.second.grade) return p1.second.grade>p2.second.grade; else if(p1.second.coun!=p2.second.coun) return p1.second.coun<p2.second.coun; else return p1.first<p2.first; } int main() { int n; unordered_map<string,school> m; cin>>n; string id,sch;double grade; while(n--){ cin>>id>>grade>>sch; if(id[0]==‘T‘) grade*=1.5; else if(id[0]==‘A‘); else grade/=1.5; for(int i=0;i<sch.length();i++) sch[i]=tolower(sch[i]); m[sch].grade+=grade; m[sch].coun++; } vector<pair<string,school>> v(m.begin(),m.end()); for_each(v.begin(),v.end(),toInt); sort(v.begin(),v.end(),cmp); int rank=1; cout<<v.size()<<endl; for(int i=0;i<v.size();i++){ if(i!=0&&v[i].second.grade!=v[i-1].second.grade) rank=(i+1); printf("%d %s %d %d\n",rank,v[i].first.c_str(),(int)v[i].second.grade,v[i].second.coun); } system("pause"); return 0; }
原文:https://www.cnblogs.com/littlepage/p/11618960.html