PAT甲级1141 PAT Ranking of Institutions :[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数、排名

文章目录

题目分析

PAT甲级1141 PAT Ranking of Institutions :[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数、排名
PAT甲级1141 PAT Ranking of Institutions :[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数、排名
来源:acwing

分析:和下面这题是一道题:
PAT甲级1137 Final Grading:[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数

排名得记录一下,做过几道类似的题目:学校首先按加权总分排行。如有并列,则应对应相同的排名,并按考生人数升序输出。这种处理方式是设一个变量rank,如果分数不一样的话,排名rank就等于前面的人数+1;如果分数一样的话,rank不变。

样例:
5
1 cmu 192 2
1 au 192 3
3 pku 100 1
4 hypu 81 2
4 lanx 81 2
代码:
 int rank =1;
    for(int i = 0; i<schools.size(); i++){
        auto a = schools[i];
        if(i== 0 || a.score != schools[i-1].score) rank = i+1;
        printf("%d %s %d %d\n",rank,a.id.c_str(),a.score,a.cnt);
    }

ac代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;

int n;
struct School{
    string id;
    int b,a,t;
    int cnt;
    int score;
//默认构造函数
    School(): b(0),a(0),t(0),cnt(0),score(0) {}
    
    //求总分数,取整(int)不是四舍五入
    void calc(){
        score = (int)(b/1.5 + a + t*1.5);
    }
    //排序:重载小于号
    bool operator<(const School& s)const{
        if(score != s.score) return score > s.score;
        else if(cnt != s.cnt) return cnt < s.cnt;
        return id < s.id;
    }
    
};

//变成小写
string change(string a){
    string res;
    for(auto s :a)
        s=tolower(s),res +=s;
    return res;
}

int main(){
    cin >>n ;
    //hash表
    unordered_map<string,School> hash1;
    
    for(int i = 0; i<n ; i++){
        string id,sch;
        int score;
        cin >> id >> score >> sch;
        sch=change(sch);
        if(id[0]=='B') hash1[sch].b += score;
        if(id[0]=='A') hash1[sch].a += score;
        if(id[0]=='T') hash1[sch].t += score;
        hash1[sch].cnt ++;
        hash1[sch].id = sch;
    }
    vector<School> schools;
    for(auto sch:hash1) {
        auto  s = sch.second;
        s.calc(); //求总分
        schools.push_back(s);//放进vector
    }
    sort(schools.begin(),schools.end());
    cout<< schools.size()<<endl;
    //排名
    int rank =1;
    for(int i = 0; i<schools.size(); i++){
        auto a = schools[i];
        if(i== 0 || a.score != schools[i-1].score) rank = i+1;
        printf("%d %s %d %d\n",rank,a.id.c_str(),a.score,a.cnt);
    }
    
}

PAT甲级1141 PAT Ranking of Institutions :[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数、排名

题目来源

PAT甲级1141 PAT Ranking of Institutions
https://www.acwing.com/problem/content/1636/

上一篇:‘凝’Alibaba领军人物技术精华、‘聚’Java开发“先驱者”实战总汇,这份《并发编程手册》不愧为“yyds”


下一篇:MySQL表关联的几种常用方式