1. 程式人生 > >1012 The Best Rank (25 point(s))

1012 The Best Rank (25 point(s))

To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C - C Programming Language, M - Mathematics (Calculus or Linear Algrbra), and E - English. At the mean time, we encourage students by emphasizing on their best ranks -- that is, among the four ranks with respect to the three courses and the average grade, we print the best rank for each student.

For example, The grades of C, M, E and A - Average of 4 students are given as the following:

StudentID  C  M  E  A
310101     98 85 88 90
310102     70 95 88 84
310103     82 87 94 88
310104     91 91 91 91

Then the best ranks for all the students are No.1 since the 1st one has done the best in C Programming Language, while the 2nd one in Mathematics, the 3rd one in English, and the last one in average.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 2 numbers N and M (≤2000), which are the total number of students, and the number of students who would check their ranks, respectively. Then N lines follow, each contains a student ID which is a string of 6 digits, followed by the three integer grades (in the range of [0, 100]) of that student in the order of C

, M and E. Then there are M lines, each containing a student ID.

Output Specification:

For each of the M students, print in one line the best rank for him/her, and the symbol of the corresponding rank, separated by a space.

The priorities of the ranking methods are ordered as A > C > M > E. Hence if there are two or more ways for a student to obtain the same best rank, output the one with the highest priority.

If a student is not on the grading list, simply output N/A.

Sample Input:

5 6
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 91 91 91
310105 85 90 90
310101
310102
310103
310104
310105
999999

Sample Output:

1 C
1 M
1 E
1 A
3 A
N/A

 大意:

給出 N個數據 和M 個排名請求

每個請求,輸入對應的id號,返回AMEC 中最好的排名,當然排名有優先順序

1.使用了四個vector 去放置對應的id和對應的成績

2.然後對其進行排序操作,從大到小

3.然後在用unordered_map 進行每一個id 的儲存,儲存的是當前的最好成績

注意點:

unordered_map 中的struct 中必須包含預設的引數初始化構造方法

一定要注意成績並列的情況,比如兩個C中都排名第一,那麼就是排名兩個的名次都是第一

#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_map>
using namespace std;

struct Anode{
    string name;
    float grade;
    Anode(string str,float grade):name(str),grade(grade){}
};

struct Cnode{
    string name;
    int grade;
    Cnode(string str,int grade):name(str),grade(grade){}
};
struct Mnode{
    string name;
    int grade;
    Mnode(string str,int grade):name(str),grade(grade){}
};
struct Enode{
    string name;
    int grade;
    Enode(string str,int grade):name(str),grade(grade){}
};

struct Outer{
    char tag;
    int level;
    Outer(char tag = ' ', int level =0):tag(tag),level(level){}
};


bool Acmp(const Anode &a,const Anode &b){
    return a.grade>b.grade;
}

bool Ccmp(const Cnode &a,const Cnode &b){
    return a.grade>b.grade;
}

bool Mcmp(const Mnode &a,const Mnode &b){
    return a.grade>b.grade;
}

bool Ecmp(const Enode &a,const Enode &b){
    return a.grade>b.grade;
}



int main(){

    int N,M;
    cin>>N>>M;

    vector<Anode> Alist;
    vector<Cnode> Clist;
    vector<Mnode> Mlist;
    vector<Enode> Elist;
    unordered_map<string,Outer> out;

    for(int i=0;i<N;i++){
        string name_temp;
        int grade =0;
        cin>>name_temp>>grade;
        Clist.push_back(Cnode(name_temp,grade));
        cin>>grade;
        Mlist.push_back(Mnode(name_temp,grade));
        cin>>grade;
        Elist.push_back(Enode(name_temp,grade));
        Alist.push_back(Anode(name_temp,((float)(grade+Clist[i].grade+Mlist[i].grade)/3.0)));
    }

    sort(Alist.begin(),Alist.end(),Acmp);
    sort(Clist.begin(),Clist.end(),Ccmp);
    sort(Mlist.begin(),Mlist.end(),Mcmp);
    sort(Elist.begin(),Elist.end(),Ecmp);


    for(int i=0;i<N;i++){

        int level_ = i+1;
        if(i>0&&Elist[i].grade==Elist[i-1].grade){
            level_=i;
        }

        if(out.find(Elist[i].name)!=out.end()){

            if(out[Elist[i].name].level>=level_){
                Outer  temp('E',level_);
                out[Elist[i].name]= temp;
            }
        }else{
            Outer  temp('E',level_);
            out[Elist[i].name]= temp;

        }
    }



    for(int i=0;i<N;i++){

        int level_ = i+1;
        if(i>0&&Mlist[i].grade==Mlist[i-1].grade){
            level_=i;
        }

        if(out.find(Mlist[i].name)!=out.end()){
            if(out[Mlist[i].name].level>=level_){

                Outer  temp('M',level_);
                out[Mlist[i].name]= temp;
            }
        }else{

            Outer  temp('M',level_);
            out[Mlist[i].name]= temp;
        }
    }


    for(int i=0;i<N;i++){
        int level_ = i+1;
        if(i>0&&Clist[i].grade==Clist[i-1].grade){
            level_=i;
        }
        if(out.find(Clist[i].name)!=out.end()){
            if(out[Clist[i].name].level>=level_){

                Outer  temp('C',level_);
                out[Clist[i].name]= temp;
            }
        }else{

            Outer  temp('C',level_);
            out[Clist[i].name]= temp;
        }
    }

    for(int i=0;i<N;i++){
        int level_ = i+1;
        if(i>0&&Alist[i].grade==Alist[i-1].grade){
            level_=i;
        }
        if(out.find(Alist[i].name)!=out.end()){
            if(out[Alist[i].name].level>=level_){

                Outer  temp('A',level_);
                out[Alist[i].name]= temp;
            }
        }else{

            Outer  temp('A',level_);
            out[Alist[i].name]= temp;
        }
    }


    for(int i=0;i<M;i++){
        string name_;
        cin>>name_;
        if(out.find(name_)!=out.end()){
            cout<<out[name_].level<<" "<<out[name_].tag<<endl;
        }else{
            cout<<"N/A"<<endl;
        }


    }

    return 0;
}

calculus

n. [病理] 結石;微積分學

linear algebra 線性代數

emphasizing

v. 強調(emphasize的現在分詞)