PAT1012

注意點:如果兩個人的成績相同,則排名並列


//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");
	}


}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章