PAT甲级 1012 The Best Rank
Posted 晚风Serein
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT甲级 1012 The Best Rank相关的知识,希望对你有一定的参考价值。
原题链接
题目大意
输入N个学生的学号,C语言、数学、英语三门科目的成绩,以及M个学号,对这M个学号依次输出其最好排名,以及排出最好排名的优先级最大的科目(C、M、E)或平均分(A)。如果输入的学号不在成绩列表中,输出N/A,如果不同的排名方法有相同的最好排名,输出优先级更大的科目(A>C>M>E)。
解题思路
题不难,使用结构体定义每个学生的学号和成绩信息。调用algorithm库的排序算法即可实现(对结构体类型的vector排序需要重写比较函数)。
如果两个学生的同一门科目分数相同,那么两个学生对这门课的排名应该相等,后面的学生正常排名。
示例代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Student
string ID;
int C, M, E;//C语言分数,数学分数,英语分数,-1表示该学生不在排名中,无成绩
int A; //平均分
int best_rank; //最佳排名
int crank; //用于排序的当前排名
char best_course; //最佳排名的优先级第一位
;
bool SortC(Student s1, Student s2) return (s1.C > s2.C);
bool SortA(Student s1, Student s2) return (s1.A > s2.A);
bool SortM(Student s1, Student s2) return (s1.M > s2.M);
bool SortE(Student s1, Student s2) return (s1.E > s2.E);
bool SortID(Student s1, Student s2) return (s1.ID < s2.ID);
//对不同科目排序并更新每个学生的最好排名
void StudentSort(vector<Student> &vec, char option)
if(option=='C')//对C语言分数排序,并更新best_rank
sort(vec.begin(), vec.end(), SortC);
for(int i=0; i<vec.size(); i++)
if(vec[i].A>=0) //只遍历有分数的学生
int cur_rank; //当前排序后的排名
if(i==0 || vec[i].C!=vec[i-1].C)//当前学生的分数与上一个学生不相等
cur_rank = i+1;
vec[i].crank = cur_rank;
else //当前学生的分数与上一个学生相等,取一样的排名
cur_rank = vec[i-1].crank;
vec[i].crank = cur_rank;
if(cur_rank < vec[i].best_rank) //当前排名小于最好排名,更新最好排名和优先级科目
vec[i].best_rank = cur_rank;
vec[i].best_course = 'C';
if(cur_rank == vec[i].best_rank) //当前排名等于最好排名,根据优先级是否替换
if(vec[i].best_course=='M' || vec[i].best_course=='E')
//当前排名的课程为C,且比原来的课程优先级高,更新
vec[i].best_course = 'C';
if(option=='M')
sort(vec.begin(), vec.end(), SortM);
for(int i=0; i<vec.size(); i++)
if(vec[i].A>=0) //只遍历有分数的学生
int cur_rank = i+1; //当前排序后的排名
if(i==0 || vec[i].M!=vec[i-1].M)//当前学生的分数与上一个学生不相等
cur_rank = i+1;
vec[i].crank = cur_rank;
else //当前学生的分数与上一个学生相等,取一样的排名
cur_rank = vec[i-1].crank;
vec[i].crank = cur_rank;
if(cur_rank < vec[i].best_rank) //当前排名小于最好排名,更新最好排名和优先级科目
vec[i].best_rank = cur_rank;
vec[i].best_course = 'M';
if(cur_rank == vec[i].best_rank) //当前排名等于最好排名,根据优先级是否替换
if(vec[i].best_course=='E')
//当前排名的课程为M,且比原来的课程优先级高,更新
vec[i].best_course = 'M';
if(option=='E')
sort(vec.begin(), vec.end(), SortE);
for(int i=0; i<vec.size(); i++)
if(vec[i].A>=0) //只遍历有分数的学生
int cur_rank = i+1; //当前排序后的排名
if(i==0 || vec[i].E!=vec[i-1].E)//当前学生的分数与上一个学生不相等
cur_rank = i+1;
vec[i].crank = cur_rank;
else //当前学生的分数与上一个学生相等,取一样的排名
cur_rank = vec[i-1].crank;
vec[i].crank = cur_rank;
if(cur_rank < vec[i].best_rank) //当前排名小于最好排名,更新最好排名和优先级科目
vec[i].best_rank = cur_rank;
vec[i].best_course = 'E';
//课程E为最小优先级,不用若排名相等,不用更新
if(option=='A')
sort(vec.begin(), vec.end(), SortA);
for(int i=0; i<vec.size(); i++)
if(vec[i].A>=0) //只遍历有分数的学生
int cur_rank = i+1; //当前排序后的排名
if(i==0 || vec[i].A!=vec[i-1].A)//当前学生的分数与上一个学生不相等
cur_rank = i+1;
vec[i].crank = cur_rank;
else //当前学生的分数与上一个学生相等,取一样的排名
cur_rank = vec[i-1].crank;
vec[i].crank = cur_rank;
if(cur_rank < vec[i].best_rank) //当前排名小于最好排名,更新最好排名和优先级科目
vec[i].best_rank = cur_rank;
vec[i].best_course = 'A';
if(cur_rank == vec[i].best_rank) //当前排名等于最好排名,根据优先级是否替换
if(vec[i].best_course=='C' || vec[i].best_course=='M' || vec[i].best_course=='E')
//当前排名的课程为A,且比原来的课程优先级高,更新
vec[i].best_course = 'A';
int main()
int N, M;
vector<Student> vec;
cin >> N >> M;
for(int pos=0; pos<N; pos++)
Student s;
cin >> s.ID >> s.C >> s.M >> s.E;
s.A = (s.C+s.E+s.M) / 3;
s.best_rank = N;
vec.push_back(s);
StudentSort(vec, 'A');
StudentSort(vec, 'C');
StudentSort(vec, 'M');
StudentSort(vec, 'E');
// M次查询
for(int pos=0; pos<M; pos++)
string id;
cin >> id;
bool id_exist = false;
for(int i=0; i<vec.size(); i++)
if(id == vec[i].ID)
cout << vec[i].best_rank << " " << vec[i].best_course << endl;
id_exist = true;
break;
if(!id_exist) cout << "N/A" << endl;
return 0;
以上是关于PAT甲级 1012 The Best Rank的主要内容,如果未能解决你的问题,请参考以下文章