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 Algrbra), 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 Specification:

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 Specification:

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

开始技术总结

  • 这一题是个排序题,分为两块首先是结构体的设计,有id记录学号注意是整型不是字符型和再就是一个grade整型数组,记录平均分和其他三门成绩。

  • 在通过额外定义一个整型Rank数组二维,一维记录学号,二维是4个空间记录每一门成绩的排名。

  • 同时定义了一个全局变量now,用于函数cmp,里面的参数使用。这里有一个坑,就是在下文中可以看见,我是额外的通过在for循环定义了j,然后再是now=j,而不是直接的在for循环里面定义now,这里是我一个错误点,导致纠结了好久。应该是for循环里面的变量是不能充当全局变量使用了。

  • 在就是定义一个number数组来存储,后面需要输出排名学生的学号,不能输入一个就输出一个排名。

  • 接下来就是每一位学生每一科排名的处理,重点因为是4科成绩,所以for循环四次,然后每次通过sort函数排序,排好之后每次给第一位学生的该门成绩排名为1,之后,再是给剩下的学生排名,如果成绩相同,那么排名就与之前的学生排名相同,如果不是就排名为i+1,而不是在原来排名的基础上加1。这部分代码如下:

	for (int j = 0; j < 4; j++) {
now = j;
sort(stu, stu + n, cmp);
Rank[stu[0].id][now] = 1;
for (int i = 1; i < n; i++) {
if (stu[i].grade[now] == stu[i - 1].grade[now]) {//如果分数相同则排名相同,与前一位进行比较
Rank[stu[i].id][now] = Rank[stu[i-1].id][now];
}
else {
Rank[stu[i].id][now] = i + 1;
}
} }
  • 然后就是输出部分了,有了之前排好名的Rank数组,如果Rank数组的二维第一位排名为0,说明该学号学生不存在。直接输出N/A,然后如果不为0,那么就需要在4个中寻找排名最靠前的,如果有多个排名相同,按照A>C>M>E的优先级输出一个即可。这里也是为啥在定义结构体Student和数组Rank时,按照0~3,存放的分数和排名顺序是按照这个优先级来的。方便输出。这部分参考代码如下:
	for (int i = 0; i < m; i++) {
if (Rank[number[i]][0] == 0) {
printf("N/A\n");
}
else {
int k = 0;//用于选出Rank[number[i]]中最小的
for (int j = 0; j < 4; j++) {
if (Rank[number[i]][j] < Rank[number[i]][k]) {
k = j;
}
}
printf("%d %c\n", Rank[number[i]][k], course[k]);
} }

所有部分参考代码入下:

//在VS2017上编写,在PAT上通过测试25分满的
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; struct Student {
int id;
int grade[4];
}stu[2010]; char course[4] = { 'A','C','M','E' };
int Rank[1000000][4];//用于记录每位学生的每门成绩排名,且从0到3分别表示A,C,M,E的成绩排名
int now;//记录是哪一门成绩开始比较 bool cmp(Student a, Student b) {
return a.grade[now] > b.grade[now];
} int main() {
int m, n;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d%d%d%d", &stu[i].id, &stu[i].grade[1], &stu[i].grade[2], &stu[i].grade[3]);
stu[i].grade[0] = round((stu[i].grade[1] + stu[i].grade[2] + stu[i].grade[3]) / 3.0);//求出平均分即A
} int number[2010];//用来存储需要输出的学号
for (int i = 0; i < m; i++) {
scanf("%d", &number[i]);
} for (int j = 0; j < 4; j++) {
now = j;
sort(stu, stu + n, cmp);
Rank[stu[0].id][now] = 1;
for (int i = 1; i < n; i++) {
if (stu[i].grade[now] == stu[i - 1].grade[now]) {//如果分数相同则排名相同,与前一位进行比较
Rank[stu[i].id][now] = Rank[stu[i-1].id][now];
}
else {
Rank[stu[i].id][now] = i + 1;
}
} } for (int i = 0; i < m; i++) {
if (Rank[number[i]][0] == 0) {
printf("N/A\n");
}
else {
int k = 0;//用于选出Rank[number[i]]中最小的
for (int j = 0; j < 4; j++) {
if (Rank[number[i]][j] < Rank[number[i]][k]) {
k = j;
}
}
printf("%d %c\n", Rank[number[i]][k], course[k]);
} } system("pause");
return 0;
}

PATA1012The Best Rank(25分)的更多相关文章

  1. 1012 The Best Rank (25分) vector与结构体排序

    1012 The Best Rank (25分)   To evaluate the performance of our first year CS majored students, we con ...

  2. PAT 甲级 1012 The Best Rank (25 分)(结构体排序)

    题意: 为了评估我们第一年的CS专业学生的表现,我们只考虑他们的三个课程的成绩:C - C编程语言,M - 数学(微积分或线性代数)和E - 英语.同时,我们鼓励学生强调自己的最优秀队伍 - 也就是说 ...

  3. PAT-1012 The Best Rank (25 分) 查询分数对应排名(包括并列)

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  4. 1012 The Best Rank (25 分)

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  5. 【PAT甲级】1012 The Best Rank (25 分)

    题意: 输入两个整数N,M(<=2000),接着分别输入N个学生的ID,C语言成绩,数学成绩和英语成绩. M次询问,每次输入学生ID,如果该ID不存在则输出N/A,存在则输出该学生排名最考前的一 ...

  6. 1012 The Best Rank (25 分)

    1012 The Best Rank (25 分) To evaluate the performance of our first year CS majored students, we cons ...

  7. A1012 The Best Rank (25)(25 分)

    A1012 The Best Rank (25)(25 分) To evaluate the performance of our first year CS majored students, we ...

  8. 1062 Talent and Virtue (25 分)

    1062 Talent and Virtue (25 分) About 900 years ago, a Chinese philosopher Sima Guang wrote a history ...

  9. A1075 PAT Judge (25)(25 分)

    A1075 PAT Judge (25)(25 分) The ranklist of PAT is generated from the status list, which shows the sc ...

随机推荐

  1. C# 1.0 新特性之异步委托(AP、APM)

    Ø  前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...

  2. day11——函数名的使用、f格式化、迭代器、递归

    day11 函数名的第一类对象及使用 1.可以当作值被赋值给变量 def func(): print(1) print(func) a = func a() 2.当作元素存放在容器中 def func ...

  3. Git拉取远程分支命令

    如果我们想从Git仓库中拉取一个分支到本地,此处假如远程分支为develop,本地要创建的分支为dev,可以使用以下命令: git init    //初始化本地Git仓库 git remote ad ...

  4. Java面试-TCP连接及其优化

    作为一个后端程序员,网络连接这块是一个绕不过的砍,当你在做服务器优化的时候,网络优化也是其中一环,那么作为网络连接中最基础的部分-TCP连接你了解吗?今天我们来仔细看看这个部分. TCP建立连接-三次 ...

  5. Python程序调试工具Py-Spy

    序言 如果你是从Java语言开发转Python开发,可能在庆幸自己的开发效率提高了很多,但是也有痛苦的时候,比如你会怀念jstack,jmap, 等各种工具在生产环境做perfomance tunin ...

  6. MAC安装Node.js

    官网下载Node.js Node.js v10.16.3 to /usr/local/bin/node • npm v6.9.0 to /usr/local/bin/npm Make sure tha ...

  7. WPF 精修篇 管理资源字典

    原文:WPF 精修篇 管理资源字典 样式太多  每个界面可能需要全局的样式 有没有肯能 WPF 中的样式 像Asp.net中 的CSS一样管理那 有的 有资源字典 BurshDictionary &l ...

  8. 脱离Office约束,C#结合Mpxj组件完美解析MSProject(.mpp)文件

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. Mybatis连接MySQL时,可以使用的JDBC连接字符串参数

    一.举例 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test_db?useAffectedRows=true&allowMultiQu ...

  10. 深入浅出JVM之垃圾收集算法

    判断哪些对象需要被回收 引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的. 但是JVM没有使 ...