标签:区间 text asi line code 成绩 -o 字母 首字母
每次 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
题解:这道题感觉就是考结构体排序,刚开始按照学校名字排序,方便计算各个学校成绩,再按照题目所示规则排序输出即可。
感觉这道题用map也可以做出来。
代码如下:
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 5 using namespace std; 6 7 struct school{ 8 string name; 9 double score; 10 int number; 11 }; 12 13 school a[100000]; 14 school b[100000]; 15 16 bool cmd( const school &a, const school &b){ 17 if( (int)a.score != (int)b.score) 18 return (int)a.score > (int)b.score; 19 else if(a.number != b.number) 20 return a.number < b.number; 21 else return a.name < b.name; 22 } 23 24 bool cmd1( const school &a, const school &b){ 25 return a.name < b.name; 26 } 27 28 int main() 29 { 30 int n, m = 0, flag = 0, k = 1, l = 0, score1; 31 double score; 32 string id, s_name; 33 scanf("%d",&n); 34 for( int i = 0; i < n; i++){ 35 cin>>id>>score>>s_name; 36 if(id[0] == ‘T‘) 37 score *= 1.5; 38 else if(id[0] == ‘B‘) 39 score /= 1.5; 40 flag = 0; 41 for( int j = 0; j < s_name.length();j++) 42 s_name[j] = tolower(s_name[j]); 43 a[i].name = s_name; 44 a[i].score = score; 45 a[i].number = 1; 46 } 47 sort(a,a+n,cmd1); 48 b[l].name = a[0].name; 49 b[l].score = a[0].score; 50 b[l].number = 1; 51 for( int i = 1; i < n; i++){ 52 if( b[l].name == a[i].name){ 53 b[l].score += a[i].score; 54 b[l].number++; 55 } 56 else{ 57 l++; 58 b[l].name = a[i].name; 59 b[l].score = a[i].score; 60 b[l].number = 1; 61 } 62 } 63 sort(b,b+l+1,cmd); 64 cout<<l+1<<endl; 65 score1 = b[0].score; 66 for( int i = 0; i < l+1; i++){ 67 if( (int)b[i].score == score1){ 68 cout<<k<<" "<<b[i].name<<" "<<(int)b[i].score<<" "<<b[i].number<<endl; 69 } 70 else{ 71 cout<<i+1<<" "<<b[i].name<<" "<<(int)b[i].score<<" "<<b[i].number<<endl; 72 score1 = (int)b[i].score; 73 k = i+1; 74 } 75 } 76 return 0; 77 }
标签:区间 text asi line code 成绩 -o 字母 首字母
原文地址:https://www.cnblogs.com/yxp400/p/9478622.html