PAT——甲級1012:The Best Rank(有坑)

 

1012 The Best Rank (25 point(s))

To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C - C Programming Language, M - Mathematics (Calculus or Linear Algrbra), and E - English. At the mean time, we encourage students by emphasizing on their best ranks -- that is, among the four ranks with respect to the three courses and the average grade, we print the best rank for each student.html

For example, The grades of CME and A - Average of 4 students are given as the following:git

StudentID  C  M  E  A
310101     98 85 88 90
310102     70 95 88 84
310103     82 87 94 88
310104     91 91 91 91

Then the best ranks for all the students are No.1 since the 1st one has done the best in C Programming Language, while the 2nd one in Mathematics, the 3rd one in English, and the last one in average.算法

Input Specification:

Each input file contains one test case. Each case starts with a line containing 2 numbers N and M (2000), which are the total number of students, and the number of students who would check their ranks, respectively. Then N lines follow, each contains a student ID which is a string of 6 digits, followed by the three integer grades (in the range of [0, 100]) of that student in the order of CM and E. Then there are M lines, each containing a student ID.數組

Output Specification:

For each of the M students, print in one line the best rank for him/her, and the symbol of the corresponding rank, separated by a space.ide

The priorities of the ranking methods are ordered as A C M E. Hence if there are two or more ways for a student to obtain the same best rank, output the one with the highest priority.函數

If a student is not on the grading list, simply output N/A.lua

Sample Input:

5 6
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 91 91 91
310105 85 90 90
310101
310102
310103
310104
310105
999999

Sample Output:

1 C
1 M
1 E
1 A
3 A
N/A

 這個題卻是不難,可是挺複雜的。spa

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

 

我這個能夠改進一下,把id當int儲存,題目中說了是6位數字。code

 

而且後面處理查找ID的時候,複雜度比較高,算法筆記裏面是申請了rank[10000000][4]這麼大的數組。儲存學生的排名信息,直接用ID去訪問。但我總以爲申請這麼大的內存,好虛呀,犧牲空間換時間。orm

其餘咱們的思路差很少。先儲存,再分別排序,再對排序結果選擇最高的輸出。

 

這道題有個坑!

題目裏面也沒說,就是相同分數是怎麼算排名。

好比91,90,88,88,84應該算做1,2,3,3,5。切記不要算做1,2,3,3,4。

相關文章
相關標籤/搜索