注意有并列的时候的名次,比如两个第一名则为1,1,3而不是1,1,2
改代码后续优化:1,按照学号查找的时候可以采用二分查找。2,代码冗余部分可以精简
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <iostream>
#include <string>using namespace std;struct Student
{//char *id;string id;int C;int M;int E;int A;int C_no;int M_no;int E_no;int A_no;
};vector<Student> vec;bool sort_A(Student s1,Student s2)
{return s1.A>s2.A;
}
bool sort_C(Student s1,Student s2)
{return s1.C>s2.C;
}
bool sort_M(Student s1,Student s2)
{return s1.M>s2.M;
}
bool sort_E(Student s1,Student s2)
{return s1.E>s2.E;
}void print(string id,int n)
{int bestRank=5000;string best="N/A";for(int i=0;i<n;i++){if(vec[i].id==id){if(vec[i].A_no<bestRank){bestRank=vec[i].A_no;best="A";}if(vec[i].C_no<bestRank){bestRank=vec[i].C_no;best="C";}if(vec[i].M_no<bestRank){bestRank=vec[i].M_no;best="M";}if(vec[i].E_no<bestRank){bestRank=vec[i].E_no;best="E";}}}if(bestRank<5000)cout<<bestRank<<" ";cout<<best<<endl;return;
}int main()
{freopen("F:/CppProject/data/1012.txt","r",stdin);int n,m;scanf("%d%d",&n,&m);int C,M,E,A;for(int i=0;i<n;i++){string sid;cin>>sid>>C>>M>>E;A=(C+M+E)/3;Student s={sid,C,M,E,A,0,0,0,0};vec.push_back(s);//cout<<s.id<<endl;}sort(vec.begin(),vec.end(),sort_A);int rank=2;vec[0].A_no=1;for(int i=1;i<n;i++){if(vec[i].A==vec[i-1].A)vec[i].A_no=vec[i-1].A_no;elsevec[i].A_no=rank;rank++;}sort(vec.begin(),vec.end(),sort_C);rank=2;vec[0].C_no=1;for(int i=1;i<n;i++){if(vec[i].C==vec[i-1].C)vec[i].C_no=vec[i-1].C_no;elsevec[i].C_no=rank;rank++;}sort(vec.begin(),vec.end(),sort_M);rank=2;vec[0].M_no=1;for(int i=1;i<n;i++){if(vec[i].M==vec[i-1].M)vec[i].M_no=vec[i-1].M_no;elsevec[i].M_no=rank;rank++;}sort(vec.begin(),vec.end(),sort_E);rank=2;vec[0].E_no=1;for(int i=1;i<n;i++){if(vec[i].E==vec[i-1].E)vec[i].E_no=vec[i-1].E_no;elsevec[i].E_no=rank;rank++;}for(int i=0;i<m;i++){string query;cin>>query;print(query,n);}return 0;
}