题面
每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。
输入
输入第一行给出一个正整数 N(≤105),即考生人数。随后 N 行,每行按下列格式给出一个考生的信息:
其中准考证号
是由 6 个字符组成的字符串,其首字母表示考试的级别:B
代表乙级,A
代表甲级,T
代表顶级;得分
是 [0, 100] 区间内的整数;学校
是由不超过 6 个英文字母组成的单位码(大小写无关)。注意:题目保证每个考生的准考证号是不同的。
输出
首先在一行中输出单位个数。随后按以下格式非降序输出单位的排行榜:
其中排名
是该单位的排名(从 1 开始);学校
是全部按小写字母输出的单位码;加权总分
定义为乙级总分/1.5 + 甲级总分 + 顶级总分*1.5
的整数部分;考生人数
是该属于单位的考生的总人数。
学校首先按加权总分排行。如有并列,则应对应相同的排名,并按考生人数升序输出。如果仍然并列,则按单位码的字典序输出。
样例输入
1 2 3 4 5 6 7 8 9 10 11
| 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
|
样例输出
1 2 3 4 5 6
| 5 1 cmu 192 2 1 au 192 3 3 pku 100 1 4 hypu 81 2 4 lanx 81 2
|
提示
无
思路
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| typedef double DB; const int mxn = 1e5 + 5;
struct P{ string s; DB sum; int num; }a[mxn];
bool cmp(P a, P b) { if(a.sum != b.sum) return a.sum > b.sum; if(a.num != b.num) return a.num < b.num; return a.s < b.s; }
int main() { int n; scanf("%d", &n);
map<string, int> mmp; string x, y; int cnt = 0; DB t;
for (int i=0; i<n; i++) { cin >> x >> t >> y; for(int j=0; j<y.length(); j++) y[j] = tolower(y[j]);
if(mmp.count(y)==0) { mmp[y] = cnt++; a[mmp[y]].s = y; }
if(x.at(0) == 'B') t /= 1.5; else if(x.at(0) == 'T') t *= 1.5;
a[mmp[y]].sum += t; a[mmp[y]].num++; } for(int i=0; i<cnt; i++) a[i].sum = floor(a[i].sum);
printf("%d\n", cnt); sort(a, a+cnt, cmp);
int rank = 1; for(int i=0; i<cnt; i++) { if(i && a[i-1].sum != a[i].sum) rank = i+1; printf("%d %s %.0lf %d\n", rank, a[i].s.c_str(), a[i].sum, a[i].num); }
return 0; }
|