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√

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