题目粗心:

给定N个学生的ID,问题和所属学校,现要求依照每一个学校参加的学生信息获取学校的排名并输入。

算法思路:

咱们应用Institution保留须要输入的学院的每一个信息,在输出的时候应用map institution容器来保留每一个学校的相干信息,而后再将信息收集结束所有学校增加进vector result容器中以不便排序从而获取排名,最初再输入即可。

获取排名的办法:
// 获取排名int ra = 1;// 初始排名 for(int i=0;i<result.size();++i){    if(i==0){        result[i].rank = ra;    }else {        if(result[i].tws==result[i-1].tws){            // 加权分数雷同的排名雷同             result[i].rank = result[i-1].rank;        }else{            // 不同的,排名等于后面的人数加1             result[i].rank = i+1;        }    }} 

留神点:

  • 1、输入的所有学校都是小写字母组成的,输出的时候得进行解决。
  • 2、学校的加权平均分是间接截断浮点数失去的,不是四舍五入。
  • 3、排序的时候,根据的是截断后的加权平均分进行的比拟。

提交后果:

AC代码:

#include<vector>#include<string>#include<iostream>#include<unordered_map>#include<algorithm>using namespace std;struct Institution{    int rank;    string school;    double TWS;    int tws;    int Ns;};unordered_map<string,Institution> institution;vector<Institution> result;bool cmp(const Institution &a,const Institution &b){    return a.tws!=b.tws?a.tws>b.tws:a.Ns!=b.Ns?a.Ns<b.Ns:a.school<b.school;}string toLowerCase(const string &s){    string r;    for(int i=0;i<s.size();++i){        if(s[i]>='A'&&s[i]<='Z'){            r += (s[i]+32);        }else{            r += s[i];        }    }    return r;}int main(){    int N;    scanf("%d",&N);    string id,school;    int score;    for(int i=0;i<N;++i){        cin>>id>>score>>school;        // 将学校名字转化为小写字符串         string r = toLowerCase(school);        institution[r].school = r;        if(id[0]=='B'){            institution[r].TWS += score/1.5;        }else if(id[0]=='A'){            institution[r].TWS += score;        }else{            institution[r].TWS += score*1.5;        }        ++institution[r].Ns;    }    unordered_map<string,Institution>::iterator it;    // 将所有学校增加进 result中不便排序     for(it=institution.begin();it!=institution.end();++it){        it->second.tws = (int)it->second.TWS;        result.push_back(it->second);    }    sort(result.begin(),result.end(),cmp);    // 获取排名    int ra = 1;// 初始排名     for(int i=0;i<result.size();++i){        if(i==0){            result[i].rank = ra;        }else {            if(result[i].tws==result[i-1].tws){                // 加权分数雷同的排名雷同                 result[i].rank = result[i-1].rank;            }else{                // 不同的,排名等于后面的人数加1                 result[i].rank = i+1;            }        }    }     // 输入    printf("%lu\n",result.size());    for(auto &item:result){        printf("%d %s %d %d\n",item.rank,item.school.c_str(),item.tws,item.Ns);    }     return 0;}