应该有更简单的方法,可以利用map,改天再看
#include<cstdio>
#include<cstring>
#include<algorithm>
#include <iostream>
using namespace std;
struct G
{
char ke_mu='\0';
int r=99999;
}g[5];
struct Stu
{
char id[10]={0};
int c=0,m=0,e=0,a=0;
int c_r=99999,m_r=99999,e_r=99999,a_r=999999;
}stu[2010];
bool cmpc(Stu a,Stu b)
{
return a.c>b.c;
}
bool cmpm(Stu a,Stu b)
{
return a.m>b.m;
}
bool cmpe(Stu a,Stu b)
{
return a.e>b.e;
}
bool cmpa(Stu a,Stu b)
{
return a.a>b.a;
}
bool cmp(G a,G b)
{
if(a.r!=b.r) return a.r<b.r;
//注意M.E的顺序与字典序不同 对应测试点3
else if(a.ke_mu=='M'&&b.ke_mu=='E') return a.ke_mu>b.ke_mu;
else if(a.ke_mu=='E'&&b.ke_mu=='M') return a.ke_mu>b.ke_mu;
else return a.ke_mu<b.ke_mu;
}
int main()
{
int n=0,m=0;
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>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,cmpc);//c排序
stu[0].c_r=1;
for(int i=1;i<n;i++)
{
if(stu[i].c!=stu[i-1].c) stu[i].c_r=i+1;
else stu[i].c_r=stu[i-1].c_r;
}
sort(stu,stu+n,cmpm);//m排序
stu[0].m_r=1;
for(int i=1;i<n;i++)
{
if(stu[i].m!=stu[i-1].m) stu[i].m_r=i+1;
else stu[i].m_r=stu[i-1].m_r;
}
sort(stu,stu+n,cmpe);//e排序
stu[0].e_r=1;
for(int i=1;i<n;i++)
{
if(stu[i].e!=stu[i-1].e) stu[i].e_r=i+1;
else stu[i].e_r=stu[i-1].e_r;
}
sort(stu,stu+n,cmpa);//a排序
stu[0].a_r=1;
for(int i=1;i<n;i++)
{
if(stu[i].a!=stu[i-1].a) stu[i].a_r=i+1;
else stu[i].a_r=stu[i-1].a_r;
}
char ide[20]={0};
for(int i=0;i<m;i++)//对每一个m输出
{
cin>>ide;
int k=-1;
for(int j=0;j<n;j++)
{
if (strcmp(ide,stu[j].id)==0) {k=j; break;}
}
if(k==-1) cout<<"N/A"<<endl;
else
{
g[0].ke_mu='C';g[0].r=stu[k].c_r;
g[1].ke_mu='M';g[1].r=stu[k].m_r;
g[2].ke_mu='E';g[2].r=stu[k].e_r;
g[3].ke_mu='A';g[3].r=stu[k].a_r;
sort(g,g+4,cmp);
cout<<g[0].r<<" "<<g[0].ke_mu<<endl;
}
}
}