PAT_甲級_1141 PAT Ranking of Institutions

題目大意:

給定N個學生的ID,成績和所屬學校,現要求按照每個學校參與的學生信息獲取學校的排名並輸出。ios

算法思路:

咱們使用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;
        }
    }
}

注意點:

  • 一、輸出的全部學校都是小寫字母組成的,輸入的時候得進行處理。
  • 二、學校的加權平均分是直接截斷浮點數獲得的,不是四捨五入。
  • 三、排序的時候,依據的是截斷後的加權平均分進行的比較。

提交結果:

image.png

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;
}
相關文章
相關標籤/搜索