每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。
输入第一行给出一个正整数 N(≤10?^5??),即考生人数。随后 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
1 #include<iostream>
2 #include<algorithm>
3 #include<map>
4 #include<cstring>
5 #include<cmath>
6 #include <unordered_map>
7 using namespace std;
8 string change(string str);//大写转小写string函数
9 typedef struct pat
10 {
11 string danwei;
12 int sumgrade=0;
13 int t=0;//计数
14 } St;
15 int cmp(St a,St b)//结构体排序
16 {
17 if(b.sumgrade != a.sumgrade)//总分不同按总分降序排
18 {
19 return b.sumgrade < a.sumgrade;
20 }
21 else if(a.t != b.t)//总分相同按数量排
22 {
23 return a.t < b.t;
24 }
25 else//数量相同按单位名字典序排
26 {
27 return a.danwei < b.danwei;
28 }
29 }
30 int main()
31 {
32 //用map标记单位
33 map<string,int>book;//标记下标以及为是否第一次出现做标记
34 map<string,double>sumfen;//记录成绩
35 int N;
36 cin>>N;
37 St sum[N];
38 int count=0;
39 string hao,name;
40 int grade;
41 for(int i=0;i<N;i++)
42 {
43 cin>>hao>>grade>>name;
44 name=change(name);//大写转小写
45 if(book[name]==0)
46 {
47 sum[count].danwei=name;
48 if(hao[0]==‘B‘)//乙级
49 sumfen[name]+=grade/1.5;
50 else if(hao[0]==‘A‘)//甲级
51 sumfen[name]+=grade;
52 else if(hao[0]==‘T‘)//顶级
53 sumfen[name]+=grade*1.5;
54 book[name]=count+1;//第count个
55 sum[count].t++;
56 count++;
57 }
58 else if(book[name]!=0)//之前出现了
59 {
60 int mark=book[name]-1;
61 if(hao[0]==‘B‘)//乙级
62 sumfen[name]+=grade/1.5;
63 else if(hao[0]==‘A‘)//甲级
64 sumfen[name]+=grade;
65 else if(hao[0]==‘T‘)//顶级
66 sumfen[name]+=grade*1.5;
67 sum[mark].t++;//数量增加
68 }
69 }
70 cout<<count<<endl;
71 for(int i=0;i<count;i++)
72 sum[i].sumgrade=(int)sumfen[sum[i].danwei];
73 sort(sum,sum+count,cmp);
74 int paiming=1;
75 for(int i=0;i<count;i++)
76 {
77 if(i==0)
78 cout<<paiming<<" "<<sum[i].danwei<<" "<<sum[i].sumgrade<<" "<<sum[i].t<<endl;
79 if(i!=0)
80 {
81 if(sum[i].sumgrade==sum[i-1].sumgrade)
82 {
83 cout<<paiming<<" "<<sum[i].danwei<<" "<<sum[i].sumgrade<<" "<<sum[i].t<<endl;
84 }
85 else
86 {
87 paiming=i+1;
88 cout<<paiming<<" "<<sum[i].danwei<<" "<<sum[i].sumgrade<<" "<<sum[i].t<<endl;
89 }
90 }
91 }
92 return 0;
93 }
94 string change(string str)
95 {
96 for(int i=0;i<str.size();i++)
97 {
98 if(str[i]>=‘A‘&&str[i]<=‘Z‘)
99 str[i]=str[i]-‘A‘+‘a‘;
100 }
101 return str;
102 }
原文:https://www.cnblogs.com/xwl3109377858/p/10489751.html