问题网址: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;
}
```
基于new Bing的编写:
注意到你在计算学校加权总分时使用了浮点数,这可能会导致精度问题。建议你在计算加权总分时直接使用整数,这样可以避免精度问题。
修改过后:
#include<stdio.h>
#include<string.h>
typedef struct candidate {
char id[7];
int grade;
char school[7];
} candidate;//考生结构体
typedef struct school {
char name[7];
int 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=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=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+=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+=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=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=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;
}
以下是一种实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAXN 100010
typedef struct {
char name[10];
int tws, ns;
int rank;
} School;
School sch[MAXN];
int cmp(const void *a, const void *b) {
School *s1 = (School *)a;
School *s2 = (School *)b;
if (s1->tws != s2->tws) return s2->tws - s1->tws;
else if (s1->ns != s2->ns) return s1->ns - s2->ns;
else return strcmp(s1->name, s2->name);
}
int main() {
int n;
scanf("%d", &n);
char id[10];
int score;
char name[10];
int cnt = 0;
for (int i = 0; i < n; i++) {
scanf("%s %d %s", id, &score, name);
for (int j = 0; j < strlen(name); j++) {
name[j] = tolower(name[j]);
}
int j;
for (j = 0; j < cnt; j++) {
if (strcmp(name, sch[j].name) == 0) break;
}
if (j == cnt) {
strcpy(sch[cnt].name, name);
cnt++;
}
if (id[0] == 'B') sch[j].tws += score / 1.5;
else if (id[0] == 'A') sch[j].tws += score;
else sch[j].tws += score * 1.5;
sch[j].ns++;
}
for (int i = 0; i < cnt; i++) {
sch[i].tws = (int)sch[i].tws;
}
qsort(sch, cnt, sizeof(School), cmp);
printf("%d\n", cnt);
int r = 1;
for (int i = 0; i < cnt; i++) {
if (i > 0 && sch[i].tws != sch[i-1].tws) r = i + 1;
printf("%d %s %d %d\n", r, sch[i].name, sch[i].tws, sch[i].ns);
}
return 0;
}
以下内容引用CHATGPT:
Dev C++ 和 PAT 平台测试结果不一致的原因可能是因为两者的编译环境和编译参数不同,导致程序在不同的环境下表现不同。解决方法是使用 PAT 平台提供的编译器进行编译和测试,以保证代码的正确性。
至于代码本身,看起来是没有问题的,可以通过 PAT 平台测试。