每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。
输入第一行给出一个正整数 N(≤105),即考生人数。随后 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.定义学校结构体,包含学校代码,分数,学生人数;
2.定义指定数量的结构体数组两个,一个存放输入数据,一个存放结果数据,都分别初始化;
3.逐个输入数据,过程中把输入分数直接进行加权,学生数统一置为1;
4.按照学校代码进行快速排序;
5.遍历数组,按照前后项是否相等决定是向结果数组中写入新学校还是增加旧学校分数,得到结果数组;
6.按照学校分数、考生人数、学校字典序进行快速排序;
7.输出。
代码如下:
#include
#include
#include
//包含学校代码、分数、学生人数的结构体
typedef struct{
char szSchool[7];
double fScore;
int iNumofStu;
} SCHOOL;
//按照学校代码排序的比较函数
int cmp_sch(const void *a, const void *b)
{
SCHOOL *p=(SCHOOL *)a;
SCHOOL *q=(SCHOOL *)b;
int flag=0;
if(strcmp(p->szSchool,q->szSchool)>0)
{
flag=1;
}
return flag;
}
//按照分数、学生人数、学校代码进行排序的比较函数
int cmp(const void *a, const void *b)
{
SCHOOL *p=(SCHOOL *)a;
SCHOOL *q=(SCHOOL *)b;
int flag=0;
int iscorep=(int)p->fScore,iscoreq=(int)q->fScore;
if(iscorepiNumofStu>q->iNumofStu)
{
flag=1;
}
else if(p->iNumofStu==q->iNumofStu)
{
if(strcmp(p->szSchool,q->szSchool)>0)
{
flag=1;
}
}
}
return flag;
}
int main()
{
int iN=0,iNumofSchool=0;
scanf("%d",&iN);
//定义两个结构体数组并初始化
SCHOOL school[iN],result[iN];
memset(school,0,iN*sizeof(SCHOOL));
memset(result,0,iN*sizeof(SCHOOL));
int pos=0;//记录结果数组的个数
//输入时临时存放数据的变量
char szTempID[7]={0},szTempSch[7]={0};
double fTempScore=0;
//输入
for(int i=0;i='A'&&szTempSch[j]<='Z')
{
szTempSch[j]+='a'-'A';
}
}
//写入数据
strcpy(school[i].szSchool,szTempSch);
school[i].fScore=fTempScore;
school[i].iNumofStu=1;
}
qsort(school,iN,sizeof(SCHOOL),cmp_sch);//快排
result[0]=school[0];//首元素赋值
for(int i=1;i
错误分析:
1.要注意在计算过程中分数一直是浮点型数据,精确计算,到最后显示的时候再整形化,否则会有误差。