排序入门(2)----PAT-A1012 The Best Rank

前一题重点在于讨论sort()函数本身。但是如果要求我们排序的内容不止一样怎么破呢。其实也很简单,引入一个结构体储存不同的元素,最后在cmp函数里面通过改变比较不同的元素来达到对每一类元素排序的效果。当然为了方便起见,使用数组储存不同元素是最好操作的。题目如下:



时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C - C Programming Language, M - Mathematics (Calculus or Linear Algebra), and E - English. At the mean time, we encourage students by emphasizing on their best ranks -- that is, among the four ranks with respect to the three courses and the average grade, we print the best rank for each student.

For example, The grades of C, M, E and A - Average of 4 students are given as the following:

StudentID  C  M  E  A
310101     98 85 88 90
310102     70 95 88 84
310103     82 87 94 88
310104     91 91 91 91

Then the best ranks for all the students are No.1 since the 1st one has done the best in C Programming Language, while the 2nd one in Mathematics, the 3rd one in English, and the last one in average.

Input

Each input file contains one test case. Each case starts with a line containing 2 numbers N and M (<=2000), which are the total number of students, and the number of students who would check their ranks, respectively. Then N lines follow, each contains a student ID which is a string of 6 digits, followed by the three integer grades (in the range of [0, 100]) of that student in the order of C, M and E. Then there are M lines, each containing a student ID.

Output

For each of the M students, print in one line the best rank for him/her, and the symbol of the corresponding rank, separated by a space.

The priorities of the ranking methods are ordered as A > C > M > E. Hence if there are two or more ways for a student to obtain the same best rank, output the one with the highest priority.

If a student is not on the grading list, simply output "N/A".

Sample Input
5 6
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 91 91 91
310105 85 90 90
310101
310102
310103
310104
310105
999999
Sample Output
1 C
1 M
1 E
1 A
3 A
N/A
题目大意:

我们知道n个考生的三门课成绩分别是C、M、E。平均分可以通过计算得到。这四样成绩的优先级分别为平均分A>C>M>E。现在给了若干学号,要求我们输出学号对应的最高排名,若排名相同输出优先级高的那个。如果学号不存在,那么输出N/A。


思路:

可以使用一个结构体Student,存放对应学号和成绩。设置一个全局变量数组,来存放排名,还有一个控制量now来控制当前排序的元素。其中id是小于int的最大表示范围的,可以开心的用int储存学号了。

我们通过使用sort函数把Student进行排序,每次按照某一元素排序后,把它现在所在位置当作排名记录在Rank数组里。最后我们输出对应元素最高排名且优先级最高就可以了。

输出对应科目时,我们可以把科目放在一个字符数组里。按照最高排名对应的序号输出对应科目即可:


#include<cstdio>
#include<algorithm>
using namespace std;
typedef struct{
	int id;
	int score[4];
}students;
students Stu[2010];

char c[4]={'A','C','M','E'};//按照优先级存放 方便输出 
int now=0;//当前排序的元素 
int Rank[10000000][4]={0};//排名 

int cmp(students a,students b){//比较函数 
	return a.score[now]>b.score[now];
}

int main(){
	int i,j,M,N;
	scanf("%d %d",&M,&N);
	for(i=0;i<M;i++){ 
		scanf("%d %d %d %d",&Stu[i].id,&Stu[i].score[1],&Stu[i].score[2],&Stu[i].score[3]);
		Stu[i].score[0]= (Stu[i].score[1]+ Stu[i].score[2]+ Stu[i].score[3])/3;
	}
	for(now=0;now<4;now++){//排序 ,然后记录下当前位置就是对应科目排名 
		sort(Stu,Stu+M,cmp);
		Rank[Stu[0].id][now] = 1;
		for(i=1;i<M;i++)
			if(Stu[i].score[now]==Stu[i-1].score[now])
				Rank[Stu[i].id][now]=Rank[Stu[i-1].id][now];
			else
				Rank[Stu[i].id][now]=i+1;
	} 
	
	int Nid,k;
	for(i=0;i<N;i++){
		scanf("%d",&Nid);
		if(Rank[Nid][0]==0)
			printf("N/A\n");
		else{
			k=0;
			for(j=1;j<4;j++)
				if(Rank[Nid][j]<Rank[Nid][k])//只有更小的情况下会改变输出数组,保证了优先级 
					k=j;
			printf("%d %c\n",Rank[Nid][k],c[k]);
		}
	}
	return 0;
}



时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C - C Programming Language, M - Mathematics (Calculus or Linear Algebra), and E - English. At the mean time, we encourage students by emphasizing on their best ranks -- that is, among the four ranks with respect to the three courses and the average grade, we print the best rank for each student.

For example, The grades of C, M, E and A - Average of 4 students are given as the following:

StudentID  C  M  E  A
310101     98 85 88 90
310102     70 95 88 84
310103     82 87 94 88
310104     91 91 91 91

Then the best ranks for all the students are No.1 since the 1st one has done the best in C Programming Language, while the 2nd one in Mathematics, the 3rd one in English, and the last one in average.

Input

Each input file contains one test case. Each case starts with a line containing 2 numbers N and M (<=2000), which are the total number of students, and the number of students who would check their ranks, respectively. Then N lines follow, each contains a student ID which is a string of 6 digits, followed by the three integer grades (in the range of [0, 100]) of that student in the order of C, M and E. Then there are M lines, each containing a student ID.

Output

For each of the M students, print in one line the best rank for him/her, and the symbol of the corresponding rank, separated by a space.

The priorities of the ranking methods are ordered as A > C > M > E. Hence if there are two or more ways for a student to obtain the same best rank, output the one with the highest priority.

If a student is not on the grading list, simply output "N/A".

Sample Input
5 6
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 91 91 91
310105 85 90 90
310101
310102
310103
310104
310105
999999
Sample Output
1 C
1 M
1 E
1 A
3 A
N/A
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值