题目翻译:
简要大义:输入两个数分别表示学生数和查询数,然后每一行输入每一个学生的学号和三门课程CME的成绩,再算出每个人的平均分,对每一科都进行排序包括平均分。然后每一行输入一个学生的学号,如果学生存在,就输出他排名最高的名词以及那门课的标号,如果存在同名次的学科,就按A->C->M->E的优先级输出,如果学生不存在就输出N/A;
题目比较简单,我们只需要排序多次即可。但是每次排序使用的比较函数不同,如果要获得C语言的排名,就通过C语言成绩排序;获得英语排名,就通过English排序;如果要获得数学排名,就通过Math排序;如果通过平均分排名,就按照Average排序。
我们定义一个学生结构体,包括id,数学分数,英语分数,C语言分数,平均分数,C语言排名,数学排名,英语排名,平均分数排名。在排序的过程将排名填入。
但是我们应该如何按照优先级去输出呢?我们每次都是找出排名最靠前的科目输出,如果排名相同再比较优先级,所以我们如果平均分的排名a=数学的排名m,则我们输出a:
void print_priority(int a, int c, int m, int e)
{
//这个函数打印出来最高排名.a c m e 分别代表的是各成绩排名
//找一个名次最低的学科输出,如果有多个就按照优先级输出
if (a <= c && a <= m && a <= e)printf("%d A\n", a);//注意这里的=,符合优先级A>C>M>E
//这里c必须严格小于a,否则我们输出的是a
else if (c < a&&c <= m && c <= e)printf("%d C\n", c);
else if (m < a&&m < c && m <= e)printf("%d M\n", m);
else printf("%d E\n", e);
}
主函数中我们只需要将输入的学生id与我们结构体数组中的学生id进行strcmp比较即可,如果返回0,说明匹配成功,调用上述的print_priority函数输出即可。
#include
#include
#include
using namespace std;
struct Student
{
char id[6];
int A, C, M, E;//每个同学的分数
int A_rank, C_rank, M_rank, E_rank;//每个分数的排名
}stu[100010];
bool cmp_A(Student a, Student b) { return a.A > b.A; }//这四个函数是排序的时候用的,分别对四个成绩排序
bool cmp_C(Student a, Student b) { return a.C > b.C; }
bool cmp_M(Student a, Student b) { return a.M > b.M; }
bool cmp_E(Student a, Student b) { return a.E > b.E; }
void print_priority(int a, int c, int m, int e)
{
//这个函数打印出来最高排名.a c m e 分别代表的是各成绩排名
//找一个名次最低的学科输出,如果有多个就按照优先级输出
if (a <= c && a <= m && a <= e)printf("%d A\n", a);//注意这里的=,符合优先级A>C>M>E
else if (c < a&&c <= m && c <= e)printf("%d C\n", c);
else if (m < a&&m < c && m <= e)printf("%d M\n", m);
else printf("%d E\n", e);
}
int main() {
int m, n;
scanf("%d%d", &n, &m);
for (int i = 0;i < n;i++) {
scanf("%s%d%d%d", stu[i].id, &stu[i].C,&stu[i].M,&stu[i].E);
stu[i].A = (stu[i].C+stu[i].M + stu[i].E) / 3;
}
sort(stu, stu + n, cmp_A);//对A成绩排序
stu[0].A_rank = 1;
for (int i = 1;i < n;i++) { //对A成绩排名
if (stu[i].A == stu[i - 1].A)
stu[i].A_rank = stu[i - 1].A_rank;
else
//无论前方是否有并列,当前排名都为i+1,除非与前者并列
stu[i].A_rank = i + 1;
}
//对C成绩排序,排名
sort(stu, stu + n, cmp_C);
stu[0].C_rank = 1;
for (int i = 1;i < n;i++) {
if (stu[i].C == stu[i - 1].C)
stu[i].C_rank = stu[i - 1].C_rank;
else
stu[i].C_rank = i + 1;
}
//对M成绩排序,排名
sort(stu, stu + n, cmp_M);
for (int i = 0;i < n;i++) stu[i].M_rank = i + 1;
stu[0].M_rank = 1;
for (int i = 1;i < n;i++) {
if (stu[i].M == stu[i - 1].M)
stu[i].M_rank = stu[i - 1].M_rank;
else
stu[i].M_rank = i + 1;
}
//对E成绩排序,排名
sort(stu, stu + n, cmp_E);
for (int i = 0;i < n;i++) stu[i].E_rank = i + 1;
stu[0].E_rank = 1;
for (int i = 1;i < n;i++) {
if (stu[i].E == stu[i - 1].E)
stu[i].E_rank = stu[i - 1].E_rank;
else
stu[i].E_rank = i + 1;
}
for (int i=0;i < m;i++) {
char M_ID[6];
bool flag = false;
scanf("%s", M_ID);
for (int j = 0; j < n; j++)
{
if (strcmp(M_ID, stu[j].id) == 0){//寻找这个同学的信息
print_max(stu[j].A_rank, stu[j].C_rank, stu[j].M_rank, stu[j].E_rank);
flag = true;
break;
}
}
if (!flag) printf("N/A\n");
}
return 0;
}
答题用时15min
Q12——finish√