PAT (Advanced Level) 1012 The Best Rank

题目链接:1012 The Best Rank

解题思路:分别对各科成绩和平均成绩进行排名并记录,之后输出学生各科和平均成绩中按照优先级最好的排名。

坑点:若有n个人排名同为i,则下一个排名应该为i+n,而非i+1.

AC代码:

/*1012 the best rank*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <vector>
using namespace std;

struct stu
{
    string id;
    int c_grade,m_grade,e_grade,avg,c_rank,m_rank,e_rank,avg_rank;
};
bool cmp_c(stu a,stu b)
{
    return a.c_grade > b.c_grade;
}
bool cmp_m(stu a,stu b)
{
    return a.m_grade > b.m_grade;
}
bool cmp_e(stu a,stu b)
{
    return a.e_grade > b.e_grade;
}
bool cmp_avg(stu a,stu b)
{
    return a.avg > b.avg;
}
int main()
{
    int n,m,stu_rank,same_rank;
    cin >> n >> m;
    stu students[n];
    for(int i = 0; i != n; ++i)//读取数据
    {
        cin >> students[i].id >> students[i].c_grade >> students[i].m_grade >> students[i].e_grade;
        students[i].avg = (students[i].c_grade + students[i].m_grade + students[i].e_grade) / 3;
    }
    vector<string> query;
    string q_id;
    for(int i = 0; i != m; ++i)//读取需要查询排名的人
    {
        cin >> q_id;
        query.push_back(q_id);
    }
    /*分别按照C、math、English、average进行排名,并读入排名*/
    sort(students,students + n,cmp_c);
    stu_rank = 1,same_rank = 1;
    for(int i = 0; i != n - 1; ++i)
    {
        if(students[i].c_grade > students[i+1].c_grade){
            students[i].c_rank = stu_rank;
            stu_rank += same_rank;
            same_rank = 1;
        }
        else{
            students[i].c_rank = stu_rank;
            same_rank++;
        }

    }
    students[n - 1].c_rank = stu_rank;
    sort(students,students + n,cmp_m);
    stu_rank = 1,same_rank = 1;
    for(int i = 0; i != n - 1; ++i)
    {
       if(students[i].m_grade > students[i+1].m_grade){
            students[i].m_rank = stu_rank;
            stu_rank += same_rank;
            same_rank = 1;
        }
        else{
            students[i].m_rank = stu_rank;
            same_rank++;
        }
    }
    students[n - 1].m_rank = stu_rank;
    sort(students,students + n,cmp_e);
    stu_rank = 1,same_rank = 1;
    for(int i = 0; i != n - 1; ++i)
    {
        if(students[i].e_grade > students[i+1].e_grade){
            students[i].e_rank = stu_rank;
            stu_rank += same_rank;
            same_rank = 1;
        }
        else{
            students[i].e_rank = stu_rank;
            same_rank++;
        }
    }
    students[n - 1].e_rank = stu_rank;
    sort(students,students + n,cmp_avg);
    stu_rank = 1,same_rank = 1;
    for(int i = 0; i != n - 1; ++i)
    {
        if(students[i].avg > students[i+1].avg){
            students[i].avg_rank = stu_rank;
            stu_rank += same_rank;
            same_rank = 1;
        }
        else{
            students[i].avg_rank = stu_rank;
            same_rank++;
        }
    }
    students[n - 1].avg_rank = stu_rank;
    /*进行查询并输出,优先级为 avg > c > m > e*/
    int index;
    for(auto q : query)
    {
        for(index = 0; index != n && students[index].id != q; ++index);
        if(index == n)
        {
            cout << "N/A" << '\n';
        }
        else if(students[index].avg_rank <= students[index].c_rank && students[index].avg_rank <= students[index].m_rank && students[index].avg_rank <= students[index].e_rank)
        {
            cout << students[index].avg_rank << ' ' << 'A' << '\n';
        }
        else if(students[index].c_rank < students[index].avg_rank && students[index].c_rank <= students[index].m_rank && students[index].c_rank <= students[index].e_rank)
        {
            cout << students[index].c_rank << ' ' << 'C' << '\n';
        }
        else if(students[index].m_rank < students[index].avg_rank && students[index].m_rank < students[index].c_rank && students[index].m_rank <= students[index].e_rank)
        {
            cout << students[index].m_rank << ' ' << 'M' << '\n';
        }
        else
        {
            cout << students[index].e_rank << ' ' << 'E' << '\n';
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值