##### 19、学校排名⭐
比较经典的一个题目
1:用map存键值对。
2:map中的值用 struct结构体存。
3:遍历map中的值存入vector进行sort排序。
4:重载结构体的比较运算符。
5:double转int 的精度需要加1e-8。
6:计算排名的rank计算。
#include<iostream>
#include<cstring>
#include<vector>
#include<unordered_map>
#include<algorithm>
using namespace std;
struct school{
string name;
double score;
int cnt;
bool operator < (school a){
if(a.score!=score) return score>a.score;
else if(a.cnt!=cnt) return cnt < a.cnt;
else return name<a.name;
}
};
int main(){
int n;
cin>>n;
unordered_map<string,school> ans1;
vector<school> ans2;
for(int i=0;i<n;i++){
string id,institute;double score;
cin>>id>>score>>institute;
for(int i=0;i<institute.size();i++) institute[i]=tolower(institute[i]);
ans1[institute].name=institute;
ans1[institute].cnt+=1;
if(id[0]=='B') ans1[institute].score+=score/1.5;
else if (id[0]=='A') ans1[institute].score+=score;
else if (id[0]=='T') ans1[institute].score+=score*1.5;
}
for(auto &m :ans1){
m.second.score = (int) (m.second.score +1e-8);
ans2.push_back(m.second);
}
sort( ans2.begin(),ans2.end() );
int rank=1;
cout<<ans2.size()<<endl;
for(int i=0;i<ans2.size();i++){
if((int)ans2[i].score != (int)ans2[i-1].score) rank = i+1;
cout<<rank<<" "<<ans2[i].name<<" "<<(int)ans2[i].score<<" "<<ans2[i].cnt<<endl;
}
}