注意:
- Case2
举例:
分数:100,100,90,90,80
排名:1,1,3,3,5 - 对map的value排序:将map的key与value转为pair<key, value>存入vector,对vector使用sort排序.
#include<cstdio>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
struct node{
char ch;
float score;
int rank;
};
int N, K;
map<int, node> A, C, M, E;
bool cmp(pair<int, node> a, pair<int, node> b){
return a.second.score > b.second.score;
}
void getrank(map<int, node> &m){
//对map的value排序
vector<pair<int, node>> v(m.begin(), m.end());
sort(v.begin(), v.end(), cmp);
float s = -1;
int i = 1, r;
for(auto it = v.begin(); it != v.end(); it++, i++){
if(it->second.score != s){s = it->second.score; r = i;}
m[it->first].rank = r;
}
}
node getmax(int id){
int ra = A[id].rank, rc = C[id].rank, rm = M[id].rank, re = E[id].rank;
if(ra <= rc && ra <= rm && ra <= re) return A[id];
else if(rc <= rm && rc <= re) return C[id];
else if(rm <= re) return M[id];
else return E[id];
}
int main(void){
scanf("%d %d", &N, &K);
for(int i = 0; i < N; i++){
int id;
float c, m, e;
scanf("%d %f %f %f", &id, &c, &m, &e);
C[id].ch = 'C', C[id].score = c;
M[id].ch = 'M', M[id].score = m;
E[id].ch = 'E', E[id].score = e;
A[id].ch = 'A', A[id].score = (c + m + e) / 3;
}
getrank(A); getrank(C); getrank(M); getrank(E);
for(int i = 0; i < K; i++){
int id;
scanf("%d", &id);
if(A.find(id) == A.end()) printf("N/A\n");
else{
node max = getmax(id);
printf("%d %c\n", max.rank, max.ch);
}
}
return 0;
}