最大的坑点就是rank的排名中:对于相同分数,相同排名
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m;
struct de{
int id;
int c;
int m;
int e;
int a;
int cr;
int mr;
int er;
int ar;
}stu[2010];
bool cmp_c(de a,de b){
return a.c>b.c;
};
bool cmp_m(de a,de b){
return a.m>b.m;
};
bool cmp_e(de a,de b){
return a.e>b.e;
};
bool cmp_a(de a,de b){
return a.a>b.a;
};
int find(int x){
for(int i=0;i<n;i++){
if(stu[i].id==x){
return i;
}
}
return -1;
}
struct ran{
char s;
int r;
int pro;
}tmp[4];
bool cmprank(ran a,ran b){
if(a.r!=b.r){
return a.r<b.r;
}else{
return a.pro<b.pro;
}
}
int main(){
freopen("in.txt","r",stdin);
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d %d %d %d",&stu[i].id,&stu[i].c,&stu[i].m,&stu[i].e);
stu[i].a=(stu[i].c+stu[i].m+stu[i].e)/3;
}
//同排名算排第几?
sort(stu,stu+n,cmp_c);
for(int i=0;i<n;i++){
if(i==0){
stu[i].cr=1;
}else{
if(stu[i].c!=stu[i-1].c){
stu[i].cr=i+1;
}else{
stu[i].cr=stu[i-1].cr;
}
}
}
sort(stu,stu+n,cmp_a);
for(int i=0;i<n;i++){
if(i==0){
stu[i].ar=1;
}else{
if(stu[i].a!=stu[i-1].a){
stu[i].ar=i+1;
}else{
stu[i].ar=stu[i-1].ar;
}
}
}
sort(stu,stu+n,cmp_m);
for(int i=0;i<n;i++){
if(i==0){
stu[i].mr=1;
}else{
if(stu[i].m!=stu[i-1].m){
stu[i].mr=i+1;
}else{
stu[i].mr=stu[i-1].mr;
}
}
}
sort(stu,stu+n,cmp_e);
for(int i=0;i<n;i++){
if(i==0){
stu[i].er=1;
}else{
if(stu[i].e!=stu[i-1].e){
stu[i].er=i+1;
}else{
stu[i].er=stu[i-1].er;
}
}
}
for(int i=0;i<m;i++){
int x;
scanf("%d",&x);
int res=find(x);
if(res==-1){
printf("N/A\n");
}else{
tmp[0].s='C';
tmp[0].pro=2;
tmp[0].r=stu[res].cr;
tmp[1].s='M';
tmp[1].pro=3;
tmp[1].r=stu[res].mr;
tmp[2].s='E';
tmp[2].pro=4;
tmp[2].r=stu[res].er;
tmp[3].s='A';
tmp[3].pro=1;
tmp[3].r=stu[res].ar;
sort(tmp,tmp+4,cmprank);
printf("%d %c\n",tmp[0].r,tmp[0].s);
}
}
return 0;
}