PAT单位排行

发布时间 2023-09-20 20:13:17作者: gao79138

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;
}