PAT单位排行
1. 题目地址
https://www.acwing.com/problem/content/1636/
2. 题目解析
3. 题解
4. 代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
struct School{
double sum;
int cnt;
string name;
//定义构造函数
School(): sum(0),cnt(0){}
//重载小于号,进行多关键字排序
bool operator<(School &s) const{
if(sum != s.sum){
return sum > s.sum;
}
if(cnt != s.cnt){
return cnt < s.cnt;
}
return name < s.name;
}
};
unordered_map<string,School> h;
vector<School> schools;
string to_lower(string str){
string result = "";
for(int i = 0; i < str.size(); i ++){
if(str[i] >= 'A' && str[i] <= 'Z'){
result += str[i] + 32;
}else{
result += str[i];
}
}
return result;
}
int main(){
int n;
scanf("%d",&n);
for(int i = 0; i < n; i ++){
string id,sch;
double score;
cin >> id >> score >> sch;
//计算加权总分
if(id[0] == 'B'){
score /= 1.5;
}else if(id[0] == 'T'){
score *= 1.5;
}
//将学校名称,统一转换成小写
sch = to_lower(sch);
h[sch].sum += score;
h[sch].cnt++;
h[sch].name = sch;
}
for(auto item : h){
//加上一个非常小的数,解决精度问题
item.second.sum = (int)(item.second.sum + 1e-8);
//将学校(结构体)放在vector数组中
schools.push_back(item.second);
}
//将学校按照多关键字排序
sort(schools.begin(),schools.end());
printf("%ld\n",schools.size());
int order = 1;
for(int i = 0; i < schools.size(); i ++){
if(i != 0 && schools[i].sum != schools[i-1].sum){
order = i + 1;
}
//输出相关信息
printf("%d %s %d %d\n",order,schools[i].name.c_str(),(int)schools[i].sum,schools[i].cnt);
}
return 0;
}