1085 PAT单位排行 (25分)
每次 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
代码讲解:此题用c真的是不太好弄,map真是神器啊,有一个办法就是先
把他们都存储上,然后按名字排个序,之后相同名字的就在一起了,这样就能
统计相同学校成绩了,最好把乙级,甲级,顶级,单独分类,都要是整形的。
不要使用double类型,因为double加多了就会出错。。。代码写的较多。。。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 typedef struct sch 5 { 6 int score,jia,yi,top; 7 char name[10]; 8 int count; 9 10 }sch; 11 sch sc[100001]; 12 void modify(char a[]) //改成小写函数。 13 { 14 int i; 15 for(i=0;a[i]!=‘\0‘;i++) 16 { 17 if(a[i]>=‘A‘&&a[i]<=‘Z‘) 18 { 19 a[i]=a[i]-‘A‘+‘a‘; 20 } 21 } 22 } 23 int cmp_name(const void *a,const void *b)//排序学校名,方便将同学校的排在一起 24 { 25 sch *s1=(sch *)a; 26 sch *s2=(sch *)b; 27 return strcmp(s1->name,s2->name); 28 } 29 int cmp(const void *a,const void *b) //结果排序 30 { 31 sch *s1=(sch *)a; 32 sch *s2=(sch *)b; 33 if(s1->score!=s2->score) 34 { 35 return s2->score-s1->score; 36 } 37 else 38 { 39 if(s1->count!=s2->count) 40 { 41 return s1->count-s2->count; 42 } 43 else 44 { 45 return strcmp(s1->name,s2->name); 46 } 47 } 48 } 49 int main() 50 { 51 52 char id[10],s[10]; 53 int score,n,i,j; 54 scanf("%d",&n); 55 for(i=0;i<n;i++) 56 { 57 scanf("%s %d %s",&id,&score,s); 58 modify(s); 59 sc[i].count++; 60 if(id[0]==‘B‘) 61 sc[i].yi+=score; 62 if(id[0]==‘A‘) 63 sc[i].jia+=score; 64 if(id[0]==‘T‘) 65 sc[i].top+=score; 66 strcpy(sc[i].name,s); 67 } 68 qsort(sc,n,sizeof(sch),cmp_name); 69 for(i=1,j=0;i<n;i++) 70 { 71 if(strcmp(sc[i].name,sc[i-1].name)==0) 72 { 73 sc[j].jia+=sc[i].jia; 74 sc[j].yi+=sc[i].yi; 75 sc[j].top+=sc[i].top; 76 sc[j].count++; 77 } 78 else 79 { 80 sc[++j]=sc[i]; 81 } 82 } 83 for(i=0;i<j+1;i++) 84 { 85 sc[i].score=sc[i].yi/1.5+sc[i].jia+sc[i].top*1.5; 86 } 87 qsort(sc,j+1,sizeof(sch),cmp); 88 int rank=1,jiange=1; 89 printf("%d\n",j+1); 90 printf("%d %s %d %d\n",rank,sc[0].name,sc[0].score,sc[0].count); 91 for(i=1;i<j+1;i++) 92 { 93 if(sc[i].score==sc[i-1].score) 94 { 95 printf("%d %s %d %d\n",rank,sc[i].name,sc[i].score,sc[i].count); 96 jiange++; //排列间隔 97 } 98 else 99 { 100 rank+=jiange; 101 jiange=1; 102 printf("%d %s %d %d\n",rank,sc[i].name,sc[i].score,sc[i].count); 103 104 } 105 } 106 return 0; 107 }
原文:https://www.cnblogs.com/bigageyuan/p/14013663.html