题目大意:
现已知N个考生的3门课分数C、M、E,而平均分数A可以由这3个分数得到。现在分别按这4个分数对n个考生从高到低排序,这样对每个考生来说,就会有4个排名且每个分数都会有一个排名。接下来会有M个查询,每个查询输入一个考生的ID, 输出该考生4个排名中最高的那个排名及对应是A、C、M、E中的哪一个。如果对不同课程有相同排名的情况,则按优先级A>C>M>E输出;如果查询的考生ID不存在,则输出N/A。
算法思路:
这里为了方便起见,使用总分代替平均分数,每一个学生保存所有的分数已经对应科目的排名信息,同时为了防止非法查询,使用isExist建立学生ID与学生的映射,由于要获取每一个学生所有科目排名中最好的排名,那么就得一一按照每一个科目的分数进行排序,然后获取对应科目的排名。属于常规排序题目,这里使用数组存储分数纯粹是为了避免写重复的代码。
注意点:
isExist的初始化得在获得排名之后,因为输出最好排名的时候需要根据isExist获取对应的学生信息,其中就包括排名
提交结果:
AC代码:
#include<cstdio>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
struct Student{
int id;
int scores[4];// A,C,M,E的分数
int rank[4];// 每一门科目的名次,依次是A>C>M>E
};
unordered_map<int,Student> isExist;// 用于判断查询的学生是否存在
char subject[4] = {'A','C','M','E'}; // 方便输出最后最高排名对于的科目
int course_index;//表示当前需要排序的科目
bool cmp(Student a, Student b){
return a.scores[course_index]>b.scores[course_index];
}
void printBestRank(int query) {
Student student = isExist[query];
int index = 0;
// 获取最好的排名
for (int i = 1; i < 4; ++i) {
if(student.rank[i]<student.rank[index]){
index = i;
}
}
printf("%d %c\n",student.rank[index],subject[index]);
}
int main(){
int N,M;// 学生人数,查询排名的学生人数
scanf("%d %d",&N,&M);
vector<Student> students;// 学生集合
Student stu;
int c,m,e;
for (int i = 0; i < N; ++i) {
scanf("%d %d %d %d",&stu.id,&c,&m,&e);
stu.scores[1] = c;
stu.scores[2] = m;
stu.scores[3] = e;
stu.scores[0] = c+m+e;
students.push_back(stu);
}
// 对所有科目进行排序
for (course_index=0;course_index<4;++course_index){
sort(students.begin(),students.end(),cmp);
// 获取当前科目的排名
for (int i = 0; i < N; ++i) {
if (i==0){
students[i].rank[course_index] = 1;
} else if (students[i].scores[course_index] == students[i-1].scores[course_index]){
students[i].rank[course_index] = students[i-1].rank[course_index];
} else {
students[i].rank[course_index] = i+1;
}
}
}
// 初始化isExist,这里得在获取完排名后在进行初始化isExit,不然会出现输出为负数的情况
for (int j = 0; j < N; ++j) {
isExist[students[j].id] = students[j];
}
// 开始查询
int query;// 待查询学生的id
for (int k = 0; k < M; ++k) {
scanf("%d",&query);
if (isExist.find(query)==isExist.end()){
// 不存在
printf("N/A\n");
} else{
printBestRank(query);
}
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。