注意有並列的時候的名次,比如兩個第一名則爲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;
else
vec[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;
else
vec[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;
else
vec[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;
else
vec[i].E_no=rank;
rank++;
}
for(int i=0;i<m;i++)
{
string query;
cin>>query;
print(query,n);
}
return 0;
}