分析:
先定义一个结构体node,存储考生所属学校排名、考生人数、总分、单位名称;
设置输出的比较函数cmp;
floor()函数有向下取整的功能;
因为输出结果需要按照题目要求,所以再定义一个vector,内部存储结构体node类型,利用cmp进行排序后,再按要求输出。
#include<bits/stdc++.h>
using namespace std;
struct node{
int rank=1,ns=0;//排名、考生人数
double tws=0.0;//加权总分
string school="";//单位名称
};
bool cmp(node a,node b){
if(a.tws!=b.tws)
return a.tws>b.tws;
else if(a.ns!=b.ns)
return a.ns<b.ns;
else
return a.school<b.school;
}
int main(){
int n;
cin>>n;
map<string,node>m;
while(n--){
string id,s;
double score;
cin>>id>>score>>s;
for(int i=0;i<s.size();i++)//将单位名称转为小写
s[i]=tolower(s[i]);
if(id[0]=='B')
score/=1.5;
else if(id[0]=='T')
score*=1.5;
m[s].tws+=score;//累加加权总分
m[s].ns++;//递增考试人数
m[s].school=s;//更新单位名称
}
vector<node> v;
for(auto it=m.begin();it!=m.end();it++){//可简写成for(auto&i:m)
(it->second).tws=floor((it->second).tws);//向下取整
v.push_back(it->second);//将数据移至vector中
}
sort(v.begin(),v.end(),cmp);//排序
for(int i=1;i<v.size();i++){
if(v[i].tws!=v[i-1].tws)
v[i].rank=i+1;
else
v[i].rank=v[i-1].rank;
}
cout<<v.size()<<endl;
for(int i=0;i<v.size();i++)
printf("%d %s %.0f %d\n",v[i].rank,v[i].school.c_str(),v[i].tws,v[i].ns);
return 0;
}