题目不难,就是自己使用的各种map和vector把我自己搞晕了~~~
# include <iostream>
# include <vector>
# include <map>
# include <functional>
# include <algorithm>
using namespace std;
struct OUTPUT{
int rank;
char bestcourse;
};
int main()
{
// 输入数据,并创建需要用的数据结构
int N, M;
cin >> N >> M;
map<string, vector<int> > stuMark;
map<string, OUTPUT> outs; // // outs是学号:排名和最好的科目 进行映射的map
for(int i=0;i<N;++i){
string id;
int C, M, E;
cin >> id >> C >> M >> E;
int A = (C+M+E+0.5) / 3;
stuMark[id] = {A, C, M, E}; // 顺序是按照优先级初始化,而不是按照输入顺序哦
outs[id].rank = 2002; // 让这个等于一个大于N的数,在核心代码rank < outs[id].rank这里很重要,不写的话outs[id].rank默认为0
}
vector<string> IDs(M);
for(int i=0;i<M;++i)
cin >> IDs[i];
// 和下面for中的i形成对应关系(i=0 -> 'A' ...... i=3 -> 'E')
map<int, char> course = {{0, 'A'}, {1, 'C'}, {2, 'M'}, {3, 'E'}};
// 核心代码
// 其实是纵向遍历,i遍历科目,j遍历每一科的成绩
// 因为在创建 stuMark 的时候已经按优先级排好了顺序,所以可以由i根据优先级进行遍历
for(int i=0;i<4;++i)
{
// 因为map不能排序,所以借用vector来排序
vector<pair<string, vector<int> > > vstuMark(stuMark.begin(), stuMark.end());
sort(vstuMark.begin(), vstuMark.end(), [i](pair<string, vector<int>> & x, pair<string, vector<int>> & y){
return x.second[i] > y.second[i];
});
int rank=1;
string id = vstuMark[0].first;
for(int j=0;j<N;++j)
{
id = vstuMark[j].first;
if(j>=1 && vstuMark[j].second[i] != vstuMark[j-1].second[i])
rank = j+1;
if(rank < outs[id].rank){
outs[id].rank = rank;
outs[id].bestcourse = course[i];
}
}
}
// 输出代码
for(string id: IDs)
if(outs.find(id) != outs.end())
cout << outs[id].rank << " " << outs[id].bestcourse << endl;
else
cout << "N/A" << endl;
return 0;
}