思路:将输入全部保存在结构体中,然后对每组输入,先进行组内排序得到其local_rank,location_number很容易获得,随着读入组数的递增而递增。当数据读完后,对结构体数组进行整体排序,得到最终的final_rank并输出。
几个需要注意的点是:
1. 排序时按照成绩从高到低,成绩相同时,按照学号从小到大。因此cmp函数为:
bool cmp(Registration a,Registration b){
if(a.grade != b.grade) return a.grade > b.grade;
else return strcmp(a.re_number,b.re_number)<0;
}
2. 排序时对相同分数的学生,其排名相同,代码如下:
for(int j=M;j<K+M;j++){
if(reg[j].grade != reg[j-1].grade){
reg[j].local_rank=j+1-M;
}
else{
reg[j].local_rank = reg[j-1].local_rank;
}
}
这里的思路是,当排序后的结构体数组中,某元素不等于其前一个元素的成绩,那么他的排名=数组下标+1;如果某元素等于其前一个元素的成绩,那么他的排名=其前一个元素的排名。
提交之后有一个测试点没通过,与题解对比之后发现是因为赋值中的错误,2中进行排名计算时,需要将第一个元素单独提出来,将其排名设置为1,进入循环后为之后的元素与前项进行比较,因此这里应该为int j=M+1才合适。