1.用map做string道double的映射
2.遍历所有映射,放进结构体数组,然后按要求排序
3.有的题解说map会超时,我的程序没有出现这个问题,最大运行时间到400多ms,如果真的超时用unordered_map
4.计算TWS的时候不用吧BAT都算出来在加权求和,实时加权求和一样的
5.sort只到len长度,一开始写了到n,结果最后一个点一直错
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
struct node{
string SCH;
double TWS;
int NS;
};
bool cmp(node a,node b)
{
if((int)a.TWS != (int)b.TWS)return a.TWS > b.TWS;
else if(a.NS != b.NS)return a.NS < b.NS;
else return a.SCH < b.SCH;
}
int main()
{
int n;
scanf("%d",&n);
string id,sch;
int grade;
map<string,node> mp;
for(int i=0;i<n;i++){
cin>>id>>grade>>sch;
for(int j=0;j<sch.length();j++){ //转换为小写
if(sch[j]>='A' && sch[j]<='Z'){
sch[j] += 'a'-'A';
}
}
if(id[0]=='B')mp[sch].TWS += 1.0*grade/1.5;
if(id[0]=='A')mp[sch].TWS += 1.0*grade;
if(id[0]=='T')mp[sch].TWS += 1.0*grade*1.5;
mp[sch].NS++;
}
node S[n]; //将map映射放入结构体数组,方便排序
int len = 0;
for(map<string,node>::iterator it=mp.begin();it!=mp.end();it++){
S[len] = it->second;
S[len].SCH = it->first;
len++;
}
sort(S,S+len,cmp); //排序
printf("%d\n",len); //sch个数
int rank = 1; //排名
for(int i=0;i<len;i++){
if(i>=1 && (int)S[i].TWS < (int)S[i-1].TWS)rank = i+1;
printf("%d ",rank);
cout<<S[i].SCH;
printf(" %d %d\n",(int)S[i].TWS,S[i].NS);
}
return 0;
}