PAT--1012 The Best Rank(排序)

参考了博文:https://www.cnblogs.com/8023spz/p/7666883.html
注意的是:排名需要特别注意的一点,成绩相同的名次也相同,就是说比如88 87 87 55,对应名次为1,2,2,4。

#include <string>
#include <algorithm>
#include <iostream>
#include <map>

using namespace std;

struct Node
{
    string num;
    int c, m, e, a;
    int rc, rm, re, ra;
};
//flag  表示cmp函数按照哪门成绩排序
int flag;
bool cmp(Node x, Node y)
{
    if(flag == 0) return x.c > y.c;
    else if(flag == 1) return x.m > y.m;
    else if(flag == 2) return x.e > y.e;
    else   return x.a > y.a;
}

void print(Node st)
{
    char subj = 'A';
    int ranks = st.ra;
    if(ranks > st.rc)
    {
        ranks = st.rc;
        subj = 'C';
    }
    if(ranks > st.rm)
    {
        ranks = st.rm;
        subj = 'M';
    }
    if(ranks > st.re)
    {
        ranks = st.re;
        subj = 'E';
    }
    cout << ranks << " " << subj << endl;
}

Node stud[2001];

map<string, int> dict;

int main()
{
    int N,M ;
    cin >> N >> M;

    for(int i = 0; i < N; i++)
    {
        cin >> stud[i].num >> stud[i].c >> stud[i].m >> stud[i].e;
        double tmp = (stud[i].c + stud[i].m + stud[i].e) / 3.0;
        stud[i].a = (int)(tmp+0.5);   //四舍五入
    }
    flag = 0;
    sort(stud, stud+N, cmp);
    for(int i = 0; i < N; i++)
    {
        if(i > 0 && stud[i].c == stud[i-1].c)
            stud[i].rc = stud[i-1].rc;
        else  stud[i].rc = i+1;
    }
    flag = 1;
    sort(stud, stud+N, cmp);
    for(int i = 0; i < N; i++)
    {
        if(i > 0 && stud[i].m == stud[i-1].m)
            stud[i].rm = stud[i-1].rm;
        else  stud[i].rm = i+1;
    }
    flag = 2;
    sort(stud, stud+N, cmp);
    for(int i = 0; i < N; i++)
    {
        if(i > 0 && stud[i].e == stud[i-1].e)
            stud[i].re = stud[i-1].re;
        else  stud[i].re = i+1;
    }
    flag = 3;
    sort(stud, stud+N, cmp);
    for(int i = 0; i < N; i++)
    {
        if(i > 0 && stud[i].a == stud[i-1].a)
            stud[i].ra = stud[i-1].ra;
        else  stud[i].ra = i+1;

        dict[stud[i].num] = i+1;   //将每个学生的编号与stud中的下标对应起来
    }
    string str;
    for(int i = 0; i < M; i++)
    {
        cin >> str;
        if(dict.count(str) == 1)
            print(stud[dict[str]-1]);
        else
            cout << "N/A" << endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/mch2869253130/article/details/88082868