问题网址:https://pintia.cn/problem-sets/994805260223102976/exam/problems/994805260353126400
每次 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
[点击并拖拽以移动]
代码长度限制
16 KB
时间限制
800 ms
内存限制
64 MB
很奇怪,我的写的代码用Dev c++运行的结果和平台测试运行的结果不一样,有没有人能帮忙找下问题
这是Dev c++运行结果
这是Pat平台测试运行的结果
以下是我的代码
#include<stdio.h>
#include<string.h>
typedef struct candidate {
char id[7];
int grade;
char school[7];
} candidate;//考生结构体
typedef struct school {
char name[7];
double grade;
int num;
} school;//学校结构体
int cmp(const void*a,const void*b) {
school A=*(school*)a;
school B=*(school*)b;
if(A.grade!=B.grade) {
return B.grade-A.grade;
}
if(A.num!=B.num) {
return A.num-B.num;
}
return strcmp(A.name,B.name);
}//排列函数
int main() {
int n;
scanf("%d",&n);
candidate data[n];
school ra[n];
for(int i=0; i<n; i++) {
scanf("%s %d %s",data[i].id,&data[i].grade,data[i].school);
for(int j=0; j<strlen(data[i].school); j++) {
if(data[i].school[j]>='A'&&data[i].school[j]<='Z') {
data[i].school[j]+=32;
}//将学校名称转换为小写
}
}//收录考生信息
int quantity=0;//学校的数量
for(int i=0; i<n; i++) {//遍历考生
if(i==0) {//第一个考生特殊处理
strcpy(ra[quantity].name,data[i].school);
if(data[i].id[0]=='B') {//累加同学的考生成绩
ra[quantity].grade=(float)data[i].grade/1.5;
} else if(data[i].id[0]=='A') {
ra[quantity].grade=data[i].grade;
} else if(data[i].id[0]=='T') {
ra[quantity].grade=(float)data[i].grade*1.5;
}
ra[quantity++].num=1;
} else {
int flag=1;//信号量-是否记录过当前考生的学校
for(int j=0; j<quantity; j++) {//遍历已经记录的学校
if(strcmp(ra[j].name,data[i].school)==0) {//若学校已经记录
flag=0;
if(data[i].id[0]=='B') {
ra[j].grade+=(float)data[i].grade/1.5;
} else if(data[i].id[0]=='A') {
ra[j].grade+=data[i].grade;
} else if(data[i].id[0]=='T') {
ra[j].grade+=(float)data[i].grade*1.5;
}
ra[j].num++;
}
}
if(flag) {// 若未记录,则新增
strcpy(ra[quantity].name,data[i].school);
if(data[i].id[0]=='B') {
ra[quantity].grade=(float)data[i].grade/1.5;
} else if(data[i].id[0]=='A') {
ra[quantity].grade=data[i].grade;
} else if(data[i].id[0]=='T') {
ra[quantity].grade=(float)data[i].grade*1.5;
}
ra[quantity++].num=1;
}
}
}
qsort(ra,quantity,sizeof(school),cmp);//排序
int grade[quantity];//记录学校的整数部分成绩
for(int i=0; i<quantity; i++) {
grade[i]=ra[i].grade;
}
int Rank[quantity];//记录学校排名
for(int i=0; i<quantity; i++) {
if(i==0) {
Rank[i]=1;
} else {
if(grade[i]==grade[i-1]) {
Rank[i]=Rank[i-1];
} else {
Rank[i]=i+1;
}
}
}
printf("%d\n",quantity);
for(int i=0; i<quantity; i++) {
printf("%d %s %d %d\n",Rank[i],ra[i].name,grade[i],ra[i].num);
}
return 0;
}
```