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企业在干嘛:)