题目描述
1141 PAT Ranking of Institutions (25分)
知识点
PAT传统艺能——排序题
实现
码前思考
需要注意一些细节:
- 成绩是直接保留整数部分而不是四舍五入;
- 对于rank的输出的代码,PAT很多题都是这个套路,我记下来了,感觉很欣慰;
代码实现
//开两个unordered_map和一个结构体
#include "bits/stdc++.h"
using namespace std;
int n;
unordered_map<string,double> score;
unordered_map<string,int> pnum;
struct node{
string school;
int tws;
int ns;
node(string s,int t,int n):school(s),tws(t),ns(n){}
};
vector<node> ans;
bool cmp(node a,node b){
if(a.tws != b.tws){
return a.tws > b.tws;
}else{
if(a.ns != b.ns){
return a.ns < b.ns;
}else{
return a.school < b.school;
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
string id;
int s;
string it;
cin>>id>>s>>it;
double factor = 0;
if(id[0] == 'A'){
factor = 1.0;
}else if(id[0] == 'B'){
factor = 1.0/1.5;
}else if(id[0] == 'T'){
factor = 1.5;
}
for(int j=0;j<it.size();j++){
if(it[j] < 'a'){
it[j] = it[j]-'A'+'a';
}
}
//之后进行判断
if(score.count(it) == 0){
score[it] = s*factor;
pnum[it] = 1;
}else{
score[it] += s*factor;
pnum[it] += 1;
}
}
for(auto it=score.begin();it!=score.end();it++){
ans.push_back(node(it->first,(int)it->second,pnum[it->first]));
}
sort(ans.begin(),ans.end(),cmp);
printf("%d\n",ans.size());
int rank=1;
int pre=ans[0].tws;
printf("%d %s %d %d\n",rank,ans[0].school.c_str(),ans[0].tws,ans[0].ns);
for(int i=1;i<ans.size();i++){
if(ans[i].tws == pre){
printf("%d %s %d %d\n",rank,ans[i].school.c_str(),ans[i].tws,ans[i].ns);
}else{
rank = i+1;
pre = ans[i].tws;
printf("%d %s %d %d\n",rank,ans[i].school.c_str(),ans[i].tws,ans[i].ns);
}
}
return 0;
}
码后反思
- STL容器
map
只能使用string
作为key
,不能使用char[]
; - PS:之前直接使用
map
,导致在新的PAT系统中提交后最后一个测试点超时,改成了unordered_map
即可AC~ - 因此能用
unordered_map
就用unordered_map
!!!