前一题重点在于讨论sort()函数本身。但是如果要求我们排序的内容不止一样怎么破呢。其实也很简单,引入一个结构体储存不同的元素,最后在cmp函数里面通过改变比较不同的元素来达到对每一类元素排序的效果。当然为了方便起见,使用数组储存不同元素是最好操作的。题目如下:
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 Input5 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 999999Sample 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];elseRank[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;
}
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 Input5 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 999999Sample Output
1 C 1 M 1 E 1 A 3 A N/A