https://pintia.cn/problem-sets/994805342720868352/problems/994805474338127872
该题是一道结构体排序题。将使用C库stdlib.h中的qsort(首地址,长度,元素大小,比较函数)。
对于学号的比较,学号可以用字符串保存,字符串可以用string.h中的strcmp()比较(字典序)
当分数相同时,按字典序比较学号,分数不同时,从大到小。
要注意的是:
并列排名,虽然排名一样,但后续排名将受到影响。
结构体指针的定义方式:struct student * st=(struct student *)element;
qsort的首地址参数可以用数组首地址+偏移的方式给出,实际上就是指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student {
char regis[13];
int loc;
int score;
int lr;
} ST[30010];
int cmp(const void *elem1,const void *elem2);
int main(void) {
int N;
int K;
int totalstudents=0;
int i,j,k;//计数
int stu_start=0,stu_index=0;
int localrank,finalrank,lastfr,lastlr;
scanf("%d",&N);
for(i=1; i<=N; i++) {
scanf("%d",&K);//考生数量
totalstudents+=K;
for(j=1; j<=K; j++) {
scanf("%s %d",ST[stu_index].regis,&ST[stu_index].score);
ST[stu_index++].loc=i;
}
qsort(ST+stu_start,K,sizeof(ST[0]),cmp);
localrank=1;
ST[stu_start].lr=1;lastlr=1;
for(k=stu_start+1; k<stu_index; k++) { //对已排序的部分,填入本地序号
if(ST[k].score==ST[k-1].score) {
ST[k].lr=lastlr;
localrank++;
} else {
ST[k].lr=++localrank;
lastlr=localrank;
}
}
stu_start=stu_index;
}
qsort(ST,stu_index,sizeof(ST[0]),cmp);
printf("%d\n",totalstudents);
finalrank=1;
printf("%s %d %d %d\n",ST[0].regis,1,ST[0].loc,ST[0].lr);lastfr=1;
for(i=1; i<stu_index; i++) {
if(ST[i].score==ST[i-1].score) {
printf("%s %d %d %d\n",ST[i].regis,lastfr,ST[i].loc,ST[i].lr);
finalrank++;
} else {
printf("%s %d %d %d\n",ST[i].regis,++finalrank,ST[i].loc,ST[i].lr);
lastfr=finalrank;
}
}
return 0;
}
int cmp(const void *elem1,const void *elem2) {
struct student *st1=(struct student *)elem1;
struct student *st2=(struct student *)elem2;
if((*st1).score!=(*st2).score) {
return (*st2).score-(*st1).score;
} else {
return strcmp((*st1).regis,(*st2).regis);
}
}
祝大家天天ac