注意排名的顺序。有并列的同名次。然后下一名要跳位。 比如 88 88 99 70 的排名应该为 2 2 1 4注意这点应该就能AC了
这个代码敲得好乱。。。。
更新了 代码 看着清爽多了
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <climits>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define MAX 2010
using namespace std;
struct node{
string id;
int g[4];
int rank,subject;
node(){rank = MAX;subject =-1;};
};
node list[MAX];
int r[MAX];//排序用
map <string,int> str2int;
char subject[4] = {'A','C','M','E'};
int p = 0;//指向哪一科
bool cmp(int a ,int b){
return list[a].g[p] > list[b].g[p];
}
int n,k;
int main(){
cin >> n >> k;
for(int i = 1 ;i <= n ;i++){
cin >> list[i].id >> list[i].g[1] >> list[i].g[2] >> list[i].g[3];
list[i].g[0] = list[i].g[1] + list[i].g[2] + list[i].g[3];
r[i] = i;//初始化排序序列
str2int[list[i].id] = i;
}
for(int i = 0 ;i < 4 ;i++){
p = i;
sort(&r[1],&r[1]+n,cmp);
int nowR = 1;
int preG = list[r[1]].g[p];
for(int j = 1 ; j <=n ;j++){
int nowP = r[j];
if(preG == list[nowP].g[p]){
if(list[nowP].rank > nowR){
list[nowP].rank = nowR;
list[nowP].subject = p;
}
}
else{
nowR = j;
preG = list[nowP].g[p];
if(list[nowP].rank > nowR){
list[nowP].rank = nowR;
list[nowP].subject = p;
}
}
}
}
string check;
for(int i = 0; i < k;i++){
cin >> check;
int nowP = str2int[check];
if(nowP == 0)
cout << "N/A" << endl;
else
cout << list[nowP].rank << " " << subject[list[nowP].subject] << endl;
}
return 0;
}