排序入门(2)----PAT-A1012 The Best Rank
来源:互联网 发布:阿里云属于paas 编辑:程序博客网 时间:2024/06/05 09:08
前一题重点在于讨论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 A310101 98 85 88 90310102 70 95 88 84310103 82 87 94 88310104 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 6310101 98 85 88310102 70 95 88310103 82 87 94310104 91 91 91310105 85 90 90310101310102310103310104310105999999Sample Output
1 C1 M1 E1 A3 AN/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 A310101 98 85 88 90310102 70 95 88 84310103 82 87 94 88310104 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 6310101 98 85 88310102 70 95 88310103 82 87 94310104 91 91 91310105 85 90 90310101310102310103310104310105999999Sample Output
1 C1 M1 E1 A3 AN/A
- 排序入门(2)----PAT-A1012 The Best Rank
- PAT-A1012. The Best Rank (25)(排序)
- PAT甲级A1012. The Best Rank (25)
- PAT---A1012. The Best Rank (25)
- PAT A1012. The Best Rank (25)
- PAT:A1012. The Best Rank (0/25)
- PAT A1012. The Best Rank (25)
- A1012. The Best Rank (25)
- PAT--1012. The Best Rank(排序)
- PAT A1012 The Best Rank 极度依靠书的思路再自己做的。。。不过ac一次过了
- PAT 1012. The Best Rank (25) 数据结构,排序
- pat 1012 The Best Rank
- pat 1012 The Best Rank
- PAT 1012 The Best Rank
- PAT 1012. The Best Rank
- PAT 1012. The Best Rank
- 【PAT】1012. The Best Rank
- PAT 1012 The Best Rank
- Java基本概念-jsp
- Material design风格控件锦集
- Codeforces #392 B. Blown Garland
- oracle数据库
- 四:const基础
- 排序入门(2)----PAT-A1012 The Best Rank
- 通过DVWA学习命令执行漏洞(Command Execution)
- How to add network openconnect editor to fedora 25?
- 通俗讲解:缓存、缓存算法和缓存框架
- C++中产生随机整数的方法(srand()函数与rand()函数)
- CSS: display:none和visibility:hidden的区别
- How to remove unused kernel from fedora 25
- 学习整理HttpClient4.5成http访问服务类
- 二分贪心专题C