标签:n+1 lib printf ons sch void ase 英文 rcp
每次 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
二、思路
坑点:每个考生成绩分别乘除1.5后求和是错误的!!
题目要求:对各级总和加权;
STEP1: 建立结构体{校名,准考证号,成绩,参赛人数}EXAMINEE;
STEP2: 将全部N个数据录入,并按校名排序,使得相同校名相邻,便于对同一学校的数据整理;
STEP3: 遍历N+1次,bSum=0,aSum=0,tSum=0 记录各级成绩的总和:
每趟循环,根据准考证号首字母,按级别,使bSum、aSum、tSum加上当前score,并使该校考生数+1;
若校名与当前考生学校不同:成绩加权求和赋值,并开始处理下一学校;
STEP4: 排序输出;
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> typedef struct { char School[7],ID[7];//School:校名 ID:准考证号; int count,score;//count:学生人数 score:成绩; }Examinee; int cmpSchool(const void * a,const void * b)//按学校单位字典序排序,是相同学校的数据排在一起; { return strcmp( (*(Examinee *)a).School , (*(Examinee *)b).School );} int cmpRank(const void * a,const void * b)//按排行榜序排序; { if( (*(Examinee *)a).score != (*(Examinee *)b).score ) return (*(Examinee *)a).score < (*(Examinee *)b).score ; else if( (*(Examinee *)a).count != (*(Examinee *)b).count ) return (*(Examinee *)a).count - (*(Examinee *)b).count ; else return strcmp( (*(Examinee *)a).School , (*(Examinee *)b).School ); } void lower(char A[])//校名小写化; { for(int i=0 ; A[i] ; i++ ) A[i]=tolower( A[i] ); } int main() { int N,score,n=0; scanf("%d",&N); Examinee A[N]; for(int i=0 ; i<N ; i++) { scanf("%s %d %s",A[i].ID,&A[i].score,A[i].School);//读入 准考证号,成绩 校名 lower(A[i].School);//校名小写化 A[i].count=0; } qsort(A,N,sizeof(Examinee ),cmpSchool);//校名字典序排序; for(int i=0,bSum=0,aSum=0,tSum=0 ; i<=N ; i++)//生成排行; { if( i == N || strcmp( A[n].School , A[i].School ) )//若校名不匹配,或已经处理完最后一名考生数据,将成绩加权求和; { A[n++].score = bSum/1.5 + aSum + tSum*1.5; if( i == N ) break;//若为最后一名考生数据,求和完毕跳出; strcpy( A[n].School , A[i].School );//处理下个学校; bSum = aSum = tSum = 0;//单科成绩总和初始化; } switch( A[i].ID[0] )//取各科成绩; { case ‘B‘: bSum+=A[i].score;break; case ‘A‘: aSum+=A[i].score;break; case ‘T‘: tSum+=A[i].score;break; } A[n].count++;//每校考生数量; } qsort(A,n,sizeof(Examinee ),cmpRank);//按排行榜要求排序; printf("%d\n",n);//学校数; for(int i=0,rank=1 ; i<n ; i++) { if( i && A[i].score != A[i-1].score ) rank=i+1; printf("%d %s %d %d\n",rank,A[i].School,A[i].score,A[i].count); } }
标签:n+1 lib printf ons sch void ase 英文 rcp
原文地址:https://www.cnblogs.com/BananaMan/p/11343070.html