注意點:如果兩個人的成績相同,則排名並列
//pseudocode
//對單個課程排序
sort_course
for i =0 to N
temp = S[i];
while(temp.math.soccer>S[j].math.soccer)
exchange S[i] and S[j];
#include<stdio.h>
#include<string.h>
int N;
int M;
struct Student
{
//A stand for soccer,and B stand for rank
//for example A[0] = 98 and B[0] = 1
char ID[6];
int A[4];
int B[4];
int equal;
};
void initial_equal(Student *S)
{
for(int i =0;i<N;i++)
{
S[i].equal = 0;
}
}
void sort_course(int course_number,Student *S)
{
initial_equal(S);
int co = course_number;
Student temp;
int j;
for(int i =0;i<N;i++)
{
j = i;
temp = S[i];
while((temp.A[co]>=S[j-1].A[co])&&j>0)
{
if(temp.A[co] == S[j-1].A[co]) S[j-1].equal = 1;
S[j] = S[j-1];
j--;
}
S[j] = temp;
}
for(int i =0;i<N;i++)
{
if(S[i].equal == 1) S[i].B[co] = S[i-1].B[co];
else
S[i].B[co] = i+1;
}
}
void sort_student(Student *S)
{
int i =0;
for(i = 0;i<4;i++)
{
sort_course(i,S);
}
}
void out_bestRank(Student S)
{
int flag;
flag = 0;
for(int i =1;i<4;i++)
{
if(S.B[i]<S.B[flag]) flag = i;
}
printf("%d ",S.B[flag]);
switch(flag)
{
case 0:printf("A\n");break;
case 1:printf("C\n");break;
case 2:printf("M\n");break;
case 3:printf("E\n");break;
default:printf("error\n");
}
}
int main()
{
scanf("%d%d",&N,&M);
Student S[2000];
for(int i =0;i<N;i++)
{
scanf("%s%d%d%d",&S[i].ID,&S[i].A[1],&S[i].A[2],&S[i].A[3]);
S[i].A[0] = (S[i].A[1]+S[i].A[2]+S[i].A[3])/3;
}
sort_student(S);
char student_id[6];
int j;
for(int i = 0;i<M;i++)
{
scanf("%s",&student_id);
for( j =0;j<N;j++)
{
if(strcmp(student_id,S[j].ID)==0)
{
out_bestRank(S[j]);
break;
}
}
if(j==N)
printf("N/A\n");
}
}