PAT 1012 The Best Rank (25 分)

1012 The Best Rank (25 分)

今天给大家分享的是PAT甲级的一道小题,设计题

原题请点击我

简单翻译:

设计一个排名表,这个表中以学生ID为主键,C表示程序设计语言的成绩,M表示数学成绩,E表示英语成绩,A表示三门的平均成绩。

查询某些人的最好的排名是多少,输出这个排名,并输出是在哪门学科获得的这个排名。如果多个学科的最好排名是一样的,按照A C M E的优先级输出。

思路:

以不同的关键字分别进行排名,获得四个表,在这四个表中分别查询这个人的最好成绩即可。

小提示

排名按照上学时候的成绩单的排名,即如果两个人得分相同,则那个名次并列,后面第一个不同的同学名次是前面的个数再 + 1。即如果两个人都考了100分,另一个人考了99分,则两个100分都是第一名,99分是第三名。


模拟出来实现即可。

C++代码:

#include"bits/stdc++.h"
#define all(x) x.begin(),x.end()
#define len(x) x.size()
#define INF (1e9)
#define vi vector<int>
#define ll long long int
#define ull unsigned long long int
#define db double
#define vvi vector<vector<int>>
#define pb(x) push_back(x);
using namespace std;

struct Node {
    int s;
    int C;
    int M;
    int E;
    int A;
    int Rank;
};

bool cmp1(struct Node a, struct Node b) {
    return a.A > b.A;
}
bool cmp2(struct Node a, struct Node b) {
    return a.C > b.C;
}
bool cmp3(struct Node a, struct Node b) {
    return a.M > b.M;
}
bool cmp4(struct Node a, struct Node b) {
    return a.E > b.E;
}
int main() {
    int N, M;
    cin >> N >> M;
    vector<struct Node> a(N);
    vector<struct Node> c(N);
    vector<struct Node> d(N);
    vector<struct Node> e(N);
    for (int i = 0; i < N; i++) {
        cin >> a[i].s >> a[i].C >> a[i].M >> a[i].E;
        a[i].A = a[i].C + a[i].M + a[i].E;
        c[i].A = a[i].A, c[i].C = a[i].C, c[i].M = a[i].M, c[i].E = a[i].E, c[i].s = a[i].s;
        d[i].A = a[i].A, d[i].C = a[i].C, d[i].M = a[i].M, d[i].E = a[i].E, d[i].s = a[i].s;
        e[i].A = a[i].A, e[i].C = a[i].C, e[i].M = a[i].M, e[i].E = a[i].E, e[i].s = a[i].s;
    }
    sort(all(a),cmp1);
    a[0].Rank = 1;
    for (int i = 1; i < N; i++) {
        if (a[i].A == a[i - 1].A) {
            a[i].Rank = a[i - 1].Rank;
        } else {
            a[i].Rank = i + 1;
        }
    }
    sort(all(c),cmp2);
    c[0].Rank = 1;
    for (int i = 1; i < N; i++) {
        if (c[i].C == c[i - 1].C) {
            c[i].Rank = c[i - 1].Rank;
        } else {
            c[i].Rank = i + 1;
        }
    }
    sort(all(d),cmp3);
    d[0].Rank = 1;
    for (int i = 1; i < N; i++) {
        if (d[i].M == d[i - 1].M) {
            d[i].Rank = d[i - 1].Rank;
        } else {
            d[i].Rank = i + 1;
        }
    }
    sort(all(e),cmp4);
    e[0].Rank = 1;
    for (int i = 1; i < N; i++) {
        if (e[i].E == e[i - 1].E) {
            e[i].Rank = e[i - 1].Rank;
        } else {
            e[i].Rank = i + 1;
        }
     }
//     cout << "a:------------------" << endl;
//     for (int i = 0; i < N; i++) {
//         cout << a[i].s << " " << a[i].A << " " << a[i].C << " " << a[i].M << " " << a[i].E << endl; 
//     }
//     cout << "c:------------------" << endl;
//     for (int i = 0; i < N; i++) {
//         cout << c[i].s << " " << c[i].A << " " << c[i].C << " " << c[i].M << " " << c[i].E << endl; 
//     }
//     cout << "d:------------------" << endl;
//     for (int i = 0; i < N; i++) {
//         cout << d[i].s << " " << d[i].A << " " << d[i].C << " " << d[i].M << " " << d[i].E << endl; 
//     }
//     cout << "e:------------------" << endl;
//     for (int i = 0; i < N; i++) {
//         cout << e[i].s << " " << e[i].A << " " << e[i].C << " " << e[i].M << " " << e[i].E << endl; 
//     }
    vector<int> b(M);
    for (int i = 0; i < M; i++) {
        cin >> b[i];
        int bestRank = INF;
        char bestType;
        int j;
        for (j = 0; j < N; j++) {
            if (a[j].s == b[i]) {
                if (a[j].Rank < bestRank) {
                    bestRank = a[j].Rank;
                    bestType = 'A';
                    break;
                } else break;
            } 
        }
        if (j == N) {
            cout << "N/A" << endl;
            continue;
        }
        for (j = 0; j < N; j++) {
            if (c[j].s == b[i]) {
                if (c[j].Rank < bestRank) {
                    bestRank = c[j].Rank;
                    bestType = 'C';
                    break;
                } else break;
            } 
        }
        for (j = 0; j < N; j++) {
            if (d[j].s == b[i]) {
                if (d[j].Rank < bestRank) {
                    bestRank = d[j].Rank;
                    bestType = 'M';
                    break;
                } else break;
                
            }
        }
        for (j = 0; j < N; j++) {
            if (e[j].s == b[i]) {
                if (e[j].Rank < bestRank) {
                    bestRank = e[j].Rank;
                    bestType = 'E';
                    break;
                } else break;
            } 
        }
        cout << bestRank << " " << bestType << endl;
    }
    return 0;
}

点我看PAT甲级的全部题解

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值