PAT A1141 PAT Ranking of Institutions [排序+硬核模拟]

题目描述

链接
给出每个学生的id、分数、学校,学校名称不区分大小写,输出学校排名、学校名称、总加权成绩、学校参赛人数。学校名称输出时候以小写方式输出

分析

  • 用s1,s2,score,sum,cnt这些来临时统计,然后用map对每个学校进行存储
  • 大小写转换:直接对单个字符使用tolower(),对于是小写的,它默认不转换
  • 注意!!!!是对最后的sum取整!!!不是中间!!否则会出错!三分的点
  • 排名的处理!!!!
int rank = 0, pres = -1;
for (int i = 0; i < ans.size(); i++) {
    if (pres != ans[i].tws) rank = i + 1;
    pres = ans[i].tws;
}

代码

#include<bits/stdc++.h>
using namespace std;

struct node{
    string s;
    int cnt;
    int sum;
};

unordered_map<string, pair<int,double> > mp;
bool cmp(node &x, node &y){
    if(x.sum == y.sum && x.cnt == y.cnt) return x.s < y.s;
    else if(x.sum == y.sum) return x.cnt < y.cnt;
    else return x.sum > y.sum;
}

int n;

int main(){
    scanf("%d", &n);
    for(int i=0;i<n;i++){
        string s1,s2;
        int score;
        double sum;
        cin>>s1>>score>>s2;
        for(int j=0;j<s2.length();j++){
            if(isupper(s2[j])) s2[j] = s2[j]-'A'+'a';
        }
        if(s1[0] == 'T') sum = 3 * score / 2.0;
        else if(s1[0] == 'A') sum = score;
        else if(s1[0] == 'B') sum = score * 2 / 3.0;
        if(mp.find(s2) == mp.end()) mp[s2] = make_pair(0,0.0);
        mp[s2].first++; mp[s2].second += sum;
    }
    vector<node> ans;
    for(auto it=mp.begin(); it != mp.end(); it++){
        ans.push_back(node{it->first, (it->second).first, (int)(it->second).second}); //注意!!!
    }
    sort(ans.begin(), ans.end(), cmp);
    printf("%d\n", ans.size());
    int rank = 1;
    int cnt = 0;
    for(int i=0;i<ans.size();i++){
        if(i!= 0){
            if(ans[i].sum != ans[i-1].sum){
                rank += cnt;
                cnt = 0;
            }
        }
        printf("%d %s %d %d\n", rank, ans[i].s.c_str(), ans[i].sum, ans[i].cnt);
        cnt++;
    }
}

posted @ 2019-09-04 19:14  Doragd  阅读(110)  评论(0编辑  收藏  举报