PAT甲级 1012 The Best Rank

Posted 晚风Serein

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT甲级 1012 The Best Rank相关的知识,希望对你有一定的参考价值。

原题链接

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的主要内容,如果未能解决你的问题,请参考以下文章

PAT甲级 1012 The Best Rank

PAT甲级 1012 The Best Rank

PAT 甲级测试题目 -- 1012 The Best Rank

PAT1012:The Best Rank

pat 1012 The Best Rank

PAT A1012 The Best Rank