参考了博文: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;
}