#include<iostream>
#include<cctype>
#include<unordered_map>
#include<algorithm>
#include<vector>
using namespace std;
struct node{
string s;
int score;
int num;
};
bool cmp(node&a,node&b){
if(a.score!=b.score) return a.score>b.score;
else if(a.num!=b.num) return a.num<b.num;
else return a.s<b.s;
}
int main(){
int n;
cin>>n;
string id,scool;
unordered_map<string,int> sn;
unordered_map<string,double> ss;
double sc;
for(int i=0;i<n;i++){
cin>>id>>sc>>scool;
for(int i=0;i<scool.size();i++){
scool[i]=tolower(scool[i]);
}
sn[scool]++;
if(id[0]=='B') sc=sc/1.5;
else if(id[0]=='T') sc=sc*1.5;
ss[scool]+=sc;
}
vector<node>ans;
for(auto it=sn.begin();it!=sn.end();it++){
ans.push_back({it->first,(int)ss[it->first],sn[it->first]});
}
sort(ans.begin(),ans.end(),cmp);
int rank=0;int pre=-1;
printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++){
if(ans[i].score==pre) printf("%d %s %d %d\n",rank,ans[i].s.c_str(),ans[i].score,ans[i].num);
else if(ans[i].score!=pre){
rank=i+1;
printf("%d %s %d %d\n",rank,ans[i].s.c_str(),ans[i].score,ans[i].num);
}
pre=ans[i].score;
}
return 0;
}
c++小问题 如果是两个string类型用cmp直接比较
in alphabetical order
他会直接按照首字母的字典序a b c d e.......比较
总结
1.这种题大体的思路是多个性质,要分别建立键值对map最好直接用unordered_map,最后再集成到一个结构体中,编写好cmp函数再进行排序
2.注意找规律,找关系
3.注意cctype里面的一些大小写转换的函数的应用,小写用小写转小写也没有问题
英语
问题 总结题型的套路