PAT甲级-1012 The Best Rank

题目

 

题目大意

学生有C、M、E三个成绩,A是这三个成绩的平均值。要求对每个学生的C、M、E、A分别排名,取这4项的最高排名为最优排名。如果一个学生有多项排名一样,按照A > C > M > E的优先级输出最优排名。

输入给出学生人数和查询人数,以及学生信息和需要查询的id。要求输出每个查询的最优排名及对应的科目,如果在学生信息中找不到要查询的id,就输出N/A。

思路

定义结构体,录入信息。再按照A C M E分别进行排序,用以学生id为键,以各科排名为值(字符串形式)的map存储排序结果,找到单科成绩的排名。之后再对应查询数组遍历map,找到每个学生对应的最优排名。注意如果不同学生的成绩相同,那么排名也必须相同,按照“1 1 1 4 5”这样的排名方式。

代码

#include <iostream>
#include <map>
#include <vector>
#include <cctype>
#include <algorithm>
using namespace std;

struct Stu{
    int id;
    int c;
    int m;
    int e;
    int a;
};  // 定义一个学生结构体

bool cmpa(Stu stu1, Stu stu2){
    return stu1.a > stu2.a;
}
bool cmpc(Stu stu1, Stu stu2){
    return stu1.c > stu2.c;
}
bool cmpm(Stu stu1, Stu stu2){
    return stu1.m > stu2.m;
}
bool cmpe(Stu stu1, Stu stu2){
    return stu1.e > stu2.e;
}  // 自定义排序规则

int main(){
    int n, m;
    cin >> n >> m;
    vector<Stu> stu(n);
    for (int i = 0; i < n; i++){
        cin >> 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;
    }
    vector<int> res(m);
    for (int i = 0; i < m; i++){
        cin >> res[i];
    }

    map<int, string> mp;
    sort(stu.begin(), stu.end(), cmpa);
    int k;
    for (int i = 0; i < n; i++){
        if (i == 0){
            mp[stu[i].id] += '1';
            k = 1;
        }else{
            if (stu[i].a == stu[i-1].a){
                mp[stu[i].id] += k + '0';
            }else{
                mp[stu[i].id] += i + 1 + '0';
                k = i + 1;
            }
        }
        mp[stu[i].id] += 'A';
    }  // 对A排名
    sort(stu.begin(), stu.end(), cmpc);
    for (int i = 0; i < n; i++){
        if (i == 0){
            mp[stu[i].id] += '1';
            k = 1;
        }else{
            if (stu[i].c == stu[i-1].c){
                mp[stu[i].id] += k + '0';
            }else{
                mp[stu[i].id] += i + 1 + '0';
                k = i + 1;
            }
        }
        mp[stu[i].id] += 'C';
    }  // 对C排名
    sort(stu.begin(), stu.end(), cmpm);
    for (int i = 0; i < n; i++){
        if (i == 0){
            mp[stu[i].id] += '1';
            k = 1;
        }else{
            if (stu[i].m == stu[i-1].m){
                mp[stu[i].id] += k + '0';
            }else{
                mp[stu[i].id] += i + 1 + '0';
                k = i + 1;
            }
        }
        mp[stu[i].id] += 'M';
    }  // 对M排名
    sort(stu.begin(), stu.end(), cmpe);
    for (int i = 0; i < n; i++){
        if (i == 0){
            mp[stu[i].id] += '1';
            k = 1;
        }else{
            if (stu[i].e == stu[i-1].e){
                mp[stu[i].id] += k + '0';
            }else{
                mp[stu[i].id] += i + 1 + '0';
                k = i + 1;
            }
        }
        mp[stu[i].id] += 'E';
    }  // 对E排名

    for (int i = 0; i < m; i++){
        int flag = 0;
        for (auto it = mp.begin(); it != mp.end(); it++){
            if (it->first == res[i]){
                flag = 1;
                string s = it->second;
                int min = 3000;
                int pos;
                for (int j = 0; j < (int)s.size(); j++){
                    if (isdigit(s[j]) && min > s[j]){
                        min = s[j];
                        pos = j;
                    }
                }
                cout << s[pos] << " " << s[pos + 1] << endl;
            }
        }
        if (flag == 0){
            cout << "N/A" << endl;
        }
    }  // 找到最优排名并输出结果

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值