pat甲级 1141 PAT Ranking of Institutions (25分)

pat甲级 1141 PAT Ranking of Institutions (25分)

1.错误代码

#include <iostream>
#include <cctype>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;

struct node {int score,ns;};

unordered_map<string,node> mp;
vector<string> s;

int Sc(int v,string id)
{
    if(id[0]=='A') return v;
    else if(id[0]=='B') return (int)(v/1.5);
    else return (int)(v*1.5);
}

bool cmp(string a,string b)
{
    if (mp[a].score!=mp[b].score) return mp[a].score>mp[b].score;
    else if(mp[a].ns!=mp[b].ns) return mp[a].ns<mp[b].ns;
    else if(a!=b) return a<b;
    else return true;
}

int main()
{
    int n,score,rank,prerank=0;
    cin>>n;
    string id,sch;
    for(int i=0;i<n;++i)
    {
        cin>>id>>score>>sch;
        //transform函数记住
        transform(sch.begin(),sch.end(),sch.begin(),::tolower);
        ++mp[sch].ns;
        mp[sch].score+=Sc(score,id);
    }
    for(auto i:mp) s.push_back(i.first);
    //mp只能用于查询不能排序
    sort(s.begin(),s.end(),cmp);
    cout<<s.size()<<endl;
    for(int i=1;i<=(int)s.size();++i)
    {
        if(i>1&&mp[s[i-1]].score==mp[s[i-2]].score) rank=prerank;
        else rank=i;
        printf("%d %s %d %d\n",rank,s[i-1].c_str(),mp[s[i-1]].score,mp[s[i-1]].ns);
        prerank=rank;
    }
    return 0;
}

1.1测试结果

在这里插入图片描述

显然,超时一定是排序超时,在线处理不可能更快了

那么,哪里超时?只要让sort排序过程直接在一个向量内部完成就不超时(不能用unordered_map排序,否则会发生各种意想不到的错误)
另外,对分数应该是加完后取整,而不是每次都取整后相加

1.2正确代码

#include <iostream>
#include <cctype>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;

struct node {double score,ns;};
struct Node {string sch;int score,ns;};

unordered_map<string,node> mp;
vector<Node> s;

double Sc(double v,string id)
{
    if(id[0]=='A') return v;
    else if(id[0]=='B') return v/1.5;
    else return v*1.5;
}

bool cmp(Node a,Node b)
{
    if (a.score!=b.score) return a.score>b.score;
    else if(a.ns!=b.ns) return a.ns<b.ns;
    else if(a.sch!=b.sch) return a.sch<b.sch;
    else return true;
}

int main()
{
    int n,rank,prerank=0;
    double score;
    cin>>n;
    string id,sch;
    for(int i=0;i<n;++i)
    {
        cin>>id>>score>>sch;
        //transform函数记住
        transform(sch.begin(),sch.end(),sch.begin(),::tolower);
        ++mp[sch].ns;
        mp[sch].score+=Sc(score,id);
    }
    for(auto i:mp) s.push_back(Node{i.first,(int)i.second.score,(int)i.second.ns});
    //mp只能用于查询不能排序
    sort(s.begin(),s.end(),cmp);
    cout<<s.size()<<endl;
    for(int i=1;i<=(int)s.size();++i)
    {
        if(i>1&&s[i-1].score==s[i-2].score) rank=prerank;
        else rank=i;
        printf("%d %s %d %d\n",rank,s[i-1].sch.c_str(),s[i-1].score,s[i-1].ns);
        prerank=rank;
    }
    return 0;
}

。。。。。。

1.3结语

本题给我上了一堂生动的stl课程;不懂stl底层结构很难ac.用c语言十分繁琐易错,不推荐。对于程序员来说,不搞编译器或者其他对速度要求很高的项目的话(比如开源的开发框架),c语言仅限熟悉。
当然如果你到了必须精通C语言开发的话,那就是精英老鸟了。看看顶级it企业在干嘛:)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值