注意点:排名顺序如果有并列,则往后延续比如1 1 1 4 5而不是1 1 1 2 3
每次排序后更新每个学生的最好排名情况。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <fstream>
using namespace std;
struct Student
{
public:
string id;
int score[4];
int bestRank;
char subject;
Student(string id, int c, int m, int e) : id(id)
{
score[0] = c;
score[1] = m;
score[2] = e;
score[3] = (c + m + e) / 3;
}
};
struct cmpA
{
bool operator()(const Student &s1, const Student &s2)
{
return s1.score[3] > s2.score[3];
}
};
struct cmpE
{
bool operator()(const Student &s1, const Student &s2)
{
return s1.score[2] > s2.score[2];
}
};
struct cmpM
{
bool operator()(const Student &s1, const Student &s2)
{
return s1.score[1] > s2.score[1];
}
};
struct cmpC
{
bool operator()(const Student &s1, const Student &s2)
{
return s1.score[0] > s2.score[0];
}
};
void updateRank(vector<Student> & v, const int subjectIndex)
{
char s;
if(subjectIndex == 0)
s = 'C';
else if(subjectIndex == 1)
s = 'M';
else if(subjectIndex == 2)
s = 'E';
else if(subjectIndex == 3)
s = 'A';
int rankb = 1;
for(int i = 0; i < v.size(); i++)
{
if(i == 0)
{
if(rankb < v[i].bestRank)
{
v[i].bestRank = rankb;
v[i].subject = s;
}
}
else
{
if(v[i].score[subjectIndex] != v[i - 1].score[subjectIndex])
rankb = i + 1;
if(rankb < v[i].bestRank)
{
v[i].bestRank = rankb;
v[i].subject = s;
}
}
}
}
int main()
{
// fstream cin("a.txt");
vector<Student> v;
int p, q;
cin>>p>>q;
string id;
int C;
int M;
int E;
for(int i = 0; i < p; i++)
{
cin>>id>>C>>M>>E;
Student s(id, C, M, E);
s.bestRank = p + 1;
v.push_back(s);
}
sort(v.begin(), v.end(), cmpA());
updateRank(v, 3);
sort(v.begin(), v.end(), cmpC());
updateRank(v, 0);
sort(v.begin(), v.end(), cmpM());
updateRank(v, 1);
sort(v.begin(), v.end(), cmpE());
updateRank(v, 2);
for(int i = 0; i < q; i++)
{
string s;
cin>>s;
int j;
for(j = 0; j < v.size(); j++)
{
if(v[j].id == s)
{
cout<<v[j].bestRank<<" "<<v[j].subject<<endl;
break;
}
}
if(j != v.size())
continue;
cout<<"N/A"<<endl;
}
}