給定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; } } }
#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; }