PTA刷题Advanced甲级——1012.The Best Rank——Day(6)

问题描述

在这里插入图片描述
题目翻译:
简要大义:输入两个数分别表示学生数和查询数,然后每一行输入每一个学生的学号和三门课程CME的成绩,再算出每个人的平均分,对每一科都进行排序包括平均分。然后每一行输入一个学生的学号,如果学生存在,就输出他排名最高的名词以及那门课的标号,如果存在同名次的学科,就按A->C->M->E的优先级输出,如果学生不存在就输出N/A;

题目分析

题目比较简单,我们只需要排序多次即可。但是每次排序使用的比较函数不同,如果要获得C语言的排名,就通过C语言成绩排序;获得英语排名,就通过English排序;如果要获得数学排名,就通过Math排序;如果通过平均分排名,就按照Average排序。
我们定义一个学生结构体,包括id,数学分数,英语分数,C语言分数,平均分数,C语言排名,数学排名,英语排名,平均分数排名。在排序的过程将排名填入。
但是我们应该如何按照优先级去输出呢?我们每次都是找出排名最靠前的科目输出,如果排名相同再比较优先级,所以我们如果平均分的排名a=数学的排名m,则我们输出a:

void print_priority(int a, int c, int m, int e) 
{
    //这个函数打印出来最高排名.a c m e 分别代表的是各成绩排名
    //找一个名次最低的学科输出,如果有多个就按照优先级输出
    if (a <= c && a <= m && a <= e)printf("%d A\n", a);//注意这里的=,符合优先级A>C>M>E
    //这里c必须严格小于a,否则我们输出的是a
    else if (c < a&&c <= m && c <= e)printf("%d C\n", c);
    else if (m < a&&m < c &&  m <= e)printf("%d M\n", m);
    else printf("%d E\n", e);
}

主函数中我们只需要将输入的学生id与我们结构体数组中的学生id进行strcmp比较即可,如果返回0,说明匹配成功,调用上述的print_priority函数输出即可。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Student
{
    char id[6];
    int A, C, M, E;//每个同学的分数
    int A_rank, C_rank, M_rank, E_rank;//每个分数的排名
}stu[100010];
bool cmp_A(Student a, Student b) { return a.A > b.A; }//这四个函数是排序的时候用的,分别对四个成绩排序
bool cmp_C(Student a, Student b) { return a.C > b.C; }
bool cmp_M(Student a, Student b) { return a.M > b.M; }
bool cmp_E(Student a, Student b) { return a.E > b.E; }
void print_priority(int a, int c, int m, int e) 
{
    //这个函数打印出来最高排名.a c m e 分别代表的是各成绩排名
    //找一个名次最低的学科输出,如果有多个就按照优先级输出
    if (a <= c && a <= m && a <= e)printf("%d A\n", a);//注意这里的=,符合优先级A>C>M>E
    else if (c < a&&c <= m && c <= e)printf("%d C\n", c);
    else if (m < a&&m < c &&  m <= e)printf("%d M\n", m);
    else printf("%d E\n", e);
}
int main() {
    int m, n;
    scanf("%d%d", &n, &m);
    for (int i = 0;i < n;i++) {
        scanf("%s%d%d%d", stu[i].id, &stu[i].C,&stu[i].M,&stu[i].E);
        stu[i].A = (stu[i].C+stu[i].M + stu[i].E) / 3;
    }
    sort(stu, stu + n, cmp_A);//对A成绩排序
    stu[0].A_rank = 1;
    for (int i = 1;i < n;i++) { //对A成绩排名
        if (stu[i].A == stu[i - 1].A)
            stu[i].A_rank = stu[i - 1].A_rank;
        else
            //无论前方是否有并列,当前排名都为i+1,除非与前者并列
            stu[i].A_rank = i + 1;
    }
    //对C成绩排序,排名
    sort(stu, stu + n, cmp_C);
    stu[0].C_rank = 1;
    for (int i = 1;i < n;i++) {
        if (stu[i].C == stu[i - 1].C)
            stu[i].C_rank = stu[i - 1].C_rank;
        else
            stu[i].C_rank = i + 1;
    }
    //对M成绩排序,排名
    sort(stu, stu + n, cmp_M);
    for (int i = 0;i < n;i++)  stu[i].M_rank = i + 1;
    stu[0].M_rank = 1;
    for (int i = 1;i < n;i++) {
        if (stu[i].M == stu[i - 1].M)
            stu[i].M_rank = stu[i - 1].M_rank;
        else
            stu[i].M_rank = i + 1;
    }
    //对E成绩排序,排名
    sort(stu, stu + n, cmp_E);
    for (int i = 0;i < n;i++)  stu[i].E_rank = i + 1;
    stu[0].E_rank = 1;
    for (int i = 1;i < n;i++) {
        if (stu[i].E == stu[i - 1].E)
            stu[i].E_rank = stu[i - 1].E_rank;
        else
            stu[i].E_rank = i + 1;
    }
    for (int i=0;i < m;i++) {
        char M_ID[6];
        bool flag = false;
        scanf("%s", M_ID);
        for (int  j = 0; j < n; j++)
        {
            if (strcmp(M_ID, stu[j].id) == 0){//寻找这个同学的信息
                print_max(stu[j].A_rank, stu[j].C_rank, stu[j].M_rank, stu[j].E_rank);
                flag = true;
                break;
            }
        }
        if (!flag) printf("N/A\n");
    }
    return 0;
}

答题用时15min
Q12——finish√

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章