lack_head 2023-04-15 20:50 采纳率: 0%
浏览 132
已结题

关于#PAT考试#的问题,如何解决?


问题网址: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++运行结果

img

这是Pat平台测试运行的结果

img

以下是我的代码

#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;
}


```

  • 写回答

2条回答 默认 最新

  • 语言-逆行者 2023-04-15 21:06
    关注

    基于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;
    }
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月15日
  • 修改了问题 4月15日
  • 赞助了问题酬金15元 4月15日
  • 创建了问题 4月15日

悬赏问题

  • ¥30 python,LLM 文本提炼
  • ¥15 关于将inet引入的相关问题
  • ¥15 关于一个倒计时的操作和显示设计
  • ¥15 提问STK的问题,哪位航天领域的同学会啊
  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 如何卸载arcgis 10.1 data reviewer for desktop
  • ¥15 共享文件夹会话中为什么会有WORKGROUP
  • ¥15 关于#python#的问题:使用ATL02数据解算光子脚点的坐标(操作系统-windows)