Sample Input:
10
A57908 85 Au
B57908 54 LanX
A37487 60 au
T28374 67 CMU
T32486 24 hypu
A66734 92 cmu
B76378 71 AU
A47780 45 lanx
A72809 100 pku
A03274 45 hypu
Sample Output:
5
1 cmu 192 2
1 au 192 3
3 pku 100 1
4 hypu 81 2
4 lanx 81 2
题解:
直接建立unordered_map<string,node>
在信息输入的时候直接存储每个学校的信息,存入的时候成绩使用double
类型,最后比较的时候将成绩转化为int
类型比较
#include <iostream>
#include <string>
#include <unordered_map>
#include <map>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
struct node{
double score;
int num;
string school;
};
int n;
set<string> sc_num;
unordered_map<string,node> mp;
bool cmp(node &a,node &b){
if(int(a.score) != int(b.score)){
return int(a.score) > int(b.score);
}
else if(a.num != b.num){
return a.num < b.num;
}
else{
return a.school < b.school;
}
}
int main(){
cin >> n;
string temp_card,temp_school;
double temp_score;
for(int i=0;i<n;i++){
cin >> temp_card;
cin >> temp_score;
cin >> temp_school;
if(temp_card[0] == 'T'){
temp_score = temp_score * 1.5;
}
else if(temp_card[0] == 'A'){
temp_score = temp_score * 1.0;
}
else if(temp_card[0] == 'B'){
temp_score = temp_score /1.5;
}
for(int j=0;j<temp_school.length();j++){
temp_school[j] = tolower(temp_school[j]);
}
sc_num.insert(temp_school);
if(mp.find(temp_school) == mp.end()){
mp[temp_school].num = 1;
mp[temp_school].score = temp_score;
mp[temp_school].school = temp_school;
}
else{
mp[temp_school].num += 1;
mp[temp_school].score += temp_score;
}
}
vector<node> ans;
for(auto i:mp) ans.push_back(i.second);
sort(ans.begin(),ans.end(),cmp);
int index = 1;
double last_socre = ans[0].score;
cout << sc_num.size() << endl;
for(int i=0;i<ans.size();i++){
if(int(ans[i].score) != int(last_socre)){
index = i+1;
}
printf("%d %s %d %d\n",index,ans[i].school.c_str(),int(ans[i].score),ans[i].num);
last_socre = ans[i].score;
}
system("pause");
return 0;
}