lpirate 1012. The Best Rank (25) 排名并列的问题

本文介绍了一个使用C++实现的学生排名系统。系统通过输入学生的ID、各科成绩等信息,计算出每位学生的平均成绩,并根据各科成绩进行排名。对于特定的学生ID,系统能够输出其在各科目中的最佳排名及对应的科目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//题意:按 平均成绩 c语言 数学 英语 中排名最高的排名输出 并输出是哪门课的排名 如果没有该id 输出 N/A
//思路:用结构题存储 a, c, m, e; ra, rc, rm, re; 用ma记录是否存在
//注意存在排名并列的问题
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

struct node {
    string id;
    int a, c, m, e;
    int ra, rc, rm, re;
};
bool cmpa(node &a, node &b){return a.a > b.a;}
bool cmpc(node &a, node &b){return a.c > b.c;}
bool cmpm(node &a, node &b){return a.m > b.m;}
bool cmpe(node &a, node &b){return a.e > b.e;}

vector<node> v;
map<string, int> ma;
int main(){
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        node t;
        cin >> t.id >> t.c >> t.m >> t.e;
        t.a = (t.c + t.m + t.e) / 3;
        v.push_back(t);
    }
    sort(v.begin(), v.end(), cmpa);
    v[0].ra = 1;
    for (int i = 1; i < v.size(); i++){
        if(v[i-1].a == v[i].a) v[i].ra = v[i-1].ra;
        else v[i].ra = i + 1;
    }
    sort(v.begin(), v.end(), cmpc);
    v[0].rc = 1;
    for (int i = 1; i < v.size(); i++){
        if(v[i-1].c == v[i].c) v[i].rc = v[i-1].rc;
        else v[i].rc = i + 1;
    }
    sort(v.begin(), v.end(), cmpm);
    v[0].rm = 1;
    for (int i = 1; i < v.size(); i++){
        if(v[i-1].m == v[i].m) v[i].rm = v[i-1].rm;
        else v[i].rm = i + 1;
    }
    sort(v.begin(), v.end(), cmpe);
    v[0].re = 1; ma[v[0].id] = 1;
    for (int i = 1; i < v.size(); i++){
        if(v[i-1].e == v[i].e) v[i].re = v[i-1].re;
        else v[i].re = i + 1;
        ma[v[i].id] = i + 1;
    }

    for (int j = 0; j < m; j++) {
        string t;
        cin >> t;
        if(ma[t]){
            int i = ma[t] - 1;
            if(v[i].ra <= v[i].rc && v[i].ra <= v[i].rm && v[i].ra <= v[i].re)
                cout << v[i].ra << ' ' << 'A' << endl;
            else if(v[i].rc < v[i].ra && v[i].rc <= v[i].rm && v[i].rc <= v[i].re)
                cout << v[i].rc << ' ' << 'C' << endl;
            else if(v[i].rm < v[i].ra && v[i].rm < v[i].rc && v[i].rm <= v[i].re)
                cout << v[i].rm << ' ' << 'M' << endl;
            else if(v[i].re < v[i].ra && v[i].re < v[i].rc && v[i].re < v[i].rm)
                cout << v[i].re << ' ' << 'E' << endl;
        }else{
            cout << "N/A\n";
        }
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值