分析: 先定义一个结构体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; }