思路:大体思路是对数据合并、排序、输出。原本我是用纯结构体数组的,但在查找同一学校时会超时,所以改为用map来计数。在合并的时候还要注意加权总分是求和之后再取整。
#include<iostream>
#include<cctype>
#include<algorithm>
#include<map>
using namespace std;
struct stu{
string name;
int sum,num;
}s[100000];
bool cmp(stu a,stu b){
return a.sum!=b.sum?a.sum>b.sum:(a.num!=b.num?a.num<b.num:a.name<b.name);
}
int main(){
int n,m,p=0;
map<string,double> psum;
map<string,int> pnum;
string x,t;
cin>>n;
for(int i=0;i<n;i++){
getchar();
cin>>t>>m>>x;
for(int j=0;j<x.length();j++)x[j]=tolower(x[j]);
if(pnum[x]==0){
s[p].name=x;
p++;
}
pnum[x]++;
psum[x]+=m*(t[0]=='B'?1/1.5:(t[0]=='T'?1.5:1));
}
for(int i=0;i<p;i++){
s[i].num=pnum[s[i].name];
s[i].sum=psum[s[i].name];
}
sort(s,s+p,cmp);
cout<<p<<endl;
for(int i=0,k=1;i<p;i++){
if(i==0||s[i].sum==s[i-1].sum)
cout<<k<<' '<<s[i].name<<' '<<s[i].sum<<' '<<s[i].num<<endl;
else{
cout<<i+1<<' '<<s[i].name<<' '<<s[i].sum<<' '<<s[i].num<<endl;
k=i+1;
}
}
return 0;
}