题意:给定一批学生考试pat的成绩,然后对该成绩进行排序,求最后排序的结果;
思路:先使用tolower函数将string变成小写的string,用unordered_map保存每个学校的总的分数,以及每个学校的人数,注意总的分数不要保存成整数,是需要对最后的结果进行保留整数,最后把两个统计的结果用结构体保存,这个时候总的分数已经是取整了的,然后进行要求排序,pre保存前一个值,rank保存当前的等级,进行对所有的学校进行排序
代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<unordered_map>
using namespace std;
struct node {
string id;
int ns,tws;
};
bool com(node a,node b) {
if (a.tws != b.tws)return a.tws > b.tws;
else if (a.ns != b.ns)return a.ns < b.ns;
else return a.id < b.id;
}
int main() {
string str,ins;
int n;
vector<node> p;
unordered_map<string, int> cnt;
unordered_map<string, double> sum;
cin >> n;
for (int i = 0; i < n; i++) {
double sco;
cin >> str >> sco >> ins;
for (int i = 0; i < ins.size(); i++) {//将所有的字母转化为小写
ins[i] = tolower(ins[i]);
}
if (str[0] == 'T') {
sco *= 1.5;
}
else if(str[0]=='B'){
sco /= 1.5;
}
sum[ins]+= sco;
cnt[ins]++;
}
for (auto i = cnt.begin(); i != cnt.end(); i++) {
p.push_back(node{(*i).first,(*i).second,(int)sum[(*i).first] });
}
sort(p.begin(),p.end(),com);
printf("%d\n",p.size());
int rank = 0, pre = -1;//rank保存当前的等级,pre保存前一个的tws
for (int i = 0; i < p.size();i++) {
if (pre != p[i].tws)rank = i + 1;
pre = p[i].tws;
printf("%d %s %d %d\n",rank,p[i].id.c_str(),(int)p[i].tws,p[i].ns);
}
system("pause");
return 0;
}