1085 PAT单位排行 数据处理

文章目录

题解

复杂数据处理题目
此题的数据不难处理
乙级最后一个题很多这种
给很多数据,让处理
首先还是要看数据结构
有映射关系,学校 - 人数和权值
最好是利用两个map进行解决,一个映射人数,一个映射权值
如果都将他们放到一个map的结构体里,会有点过不去,数据处理问题往往实现的较为困难,但是慢慢做也是可以出来
但有一些点就会被忽略掉,还有慢慢改bug,最好是首先就选择一个好是数据结构
糟糕的实现,往往顾不上细节的代码,只为了大致的正确
以下为柳神题解

两个map,⼀个cnt⽤来存储某学校名称对应的参赛⼈数,另⼀个sum计算某学校名称对应的总
加权成绩。每次学校名称string school都要转化为全⼩写,将map中所有学校都保存在vector ans中,
类型为node,node中包括学校姓名、加权总分、参赛⼈数。对ans数组排序,根据题⽬要求写好cmp
函数,最后按要求输出。对于排名的处理:设⽴pres表示前⼀个学校的加权总分,如果pres和当前学
校的加权总分不同,说明rank等于数组下标+1,否则rank不变~
注意:总加权分数取整数部分是要对最后的总和取整数部分,不能每次都直接⽤int存储,不然会有⼀
个3分测试点不通过~

Code

#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
struct node
{
    int x;
    string s;
    int cnt;
};
double f(int x, char c)
{
    if (c == 'T')
        return x * 1.5;
    else if (c == 'A')
        return x;
    else if (c == 'B')
        return x / 1.5;
}
bool cmp(node &e1, node &e2)
{
    if (e1.x == e2.x)
    {
        if (e1.cnt == e2.cnt)
            return e1.s < e2.s;
        return e1.cnt < e2.cnt;
    }
    return e1.x > e2.x;
}
int main()
{
    vector<node> v;
    map<string, int> rap;
    map<string, double> sum;
    int N;
    cin >> N;
    while (N--)
    {
        string a, name;
        double x;
        cin >> a >> x >> name;

        for (auto &e : name)
            e = tolower(e);

        x = f(x, a[0]);
        rap[name]++;
        sum[name] += x;
    }
    for (auto &e : rap)
    {
        v.push_back({(int)sum[e.first], e.first, e.second});
    }
    sort(v.begin(), v.end(), cmp);
    int t = 1;
    int level = -1;

    cout << rap.size() << endl;

    for (int i = 0; i < v.size(); i++)
    {
        if (level != v[i].x)
            t = i + 1;
        cout << t << ' ';
        cout << v[i].s << " " << (int)v[i].x << " " << v[i].cnt << endl;
        level = (int)v[i].x;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值