存TWS要用double存,比较,输出的时候用int,最后一个测试点(3’);
#include<bits/stdc++.h>
using namespace std;
int n,cnt=1;
unordered_map<string,int> mm;
unordered_map<int,string> nn;
struct node{
string name;
double tws=0;
int ns=0,rank;
}v[100010];
string change(string ans){
string an="";
for(auto i:ans){
char c=tolower(i);
an.push_back(c);
}
return an;
}
double ch(string a,double cum){
if(a[0]=='B')
cum=cum/1.5;
else if(a[0]=='T')
cum=cum*1.5;
return cum;
}
bool cmp(node a,node b){
if((int)a.tws==(int)b.tws){
if(a.ns==b.ns)
return a.name<b.name;
return a.ns<b.ns;
}
return (int)a.tws>(int)b.tws;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
string a,c;
double b;
cin>>a>>b>>c;
c=change(c);
b=ch(a,b);
int num;
if(mm[c]){
num=mm[c];
}
else{
num=cnt++;
mm[c]=num;
nn[num]=c;
}
v[num].name=c;
v[num].tws+=b;
v[num].ns+=1;
}
sort(v+1,v+cnt,cmp);
int r=1,time=1;
printf("%d\n",cnt-1);
for(int i=1;i<cnt;i++){
if(i==1)
printf("%d %s %d %d\n",r,v[i].name.c_str(),(int)v[i].tws,v[i].ns);
else{
if((int)v[i].tws==(int)v[i-1].tws){
printf("%d %s %d %d\n",r,v[i].name.c_str(),(int)v[i].tws,v[i].ns);
time++;
}
else{
r+=time;
time=1;
printf("%d %s %d %d\n",r,v[i].name.c_str(),(int)v[i].tws,v[i].ns);
}
}
}
return 0;
}