题目地址:
PAT—A1012 The Best Rank (25 分)
题意
首先输入给出 n , m 代表 n 个学生和 m 个查询,接下来的 n 行分别输入 n 个学生的学号和 C , M , E 三科成绩( A 是三科成绩四舍五入得到的平均成绩。现在要求分别按 4 个分数(C , M , E , A)对 n 个学生进行排名(分数一样的具有相同的名次),这样对每个学生来说都有四个名次(每个分数都有 1 个名次)。接下来会有 m 个查询,每个查询输入一个考生的学号,要求输出该考生 4 个排名中最高的那个排名及对应的是 A,C,M,E 中的哪一个。如果对不同的课程有相同的排名,则按 A>C>M>E 的优先级输出;如果查询的考生的学号不存在,则输出 N/A。
思路
- 安排下标:因为优先级为:A>C>M>E,不妨在设置数组是就按照这个顺序分配下标:0-A,1-C,2-M,3-E。
- 存储结构:每个学生用一个结构体进行存储,包含的信息有:学号,四个分数,四个排名。
- 输入:读入每个学生的学号,三门课的成绩,然后四舍五入算出平均成绩,这样就将学生的信息存入到结构体数组中。
- 排名次:分别根据四个分数对结构体数组进行排序,给出每个学生每个分数的名次。
- 输出:根据输入的查询和优先级关系,输出该考生 4 个排名中最高的那个排名及对应的是 A,C,M,E 中的哪一个
需要注意
- 因为要求输出最高排名及对应的是 A,C,M,E 中的哪一个,所以可以用一个 char 数组(或者用map)
mp[0]='A';mp[1]='C';mp[2]='M';mp[3]='E';
- 如果分数相同则排名相同,所以不可以简单的进行排序,在排序之后再一个个的给出他们的名次
- 根据给的例子可以看出来平均分是由三门课分数之和求平均然后四舍五入得到。
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef struct
{
int s[4],r[4];
char no[7];
}STU;
char mp[4];int now;
bool cmp(STU s1,STU s2)
{
return s1.s[now]>s2.s[now];
}
int main