版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://cloud.tencent.com/developer/article/1535054
每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。
输入第一行给出一个正整数 N(≤105),即考生人数。随后 N 行,每行按下列格式给出一个考生的信息:
准考证号 得分 学校
其中准考证号
是由 6 个字符组成的字符串,其首字母表示考试的级别:B
代表乙级,A
代表甲级,T
代表顶级;得分
是 0, 100 区间内的整数;学校
是由不超过 6 个英文字母组成的单位码(大小写无关)。注意:题目保证每个考生的准考证号是不同的。
首先在一行中输出单位个数。随后按以下格式非降序输出单位的排行榜:
排名 学校 加权总分 考生人数
其中排名
是该单位的排名(从 1 开始);学校
是全部按小写字母输出的单位码;加权总分
定义为乙级总分/1.5 + 甲级总分 + 顶级总分*1.5
的整数部分;考生人数
是该属于单位的考生的总人数。
学校首先按加权总分排行。如有并列,则应对应相同的排名,并按考生人数升序输出。如果仍然并列,则按单位码的字典序输出。
10
A57908 85 Au
B57908 54 LanX
A37487 60 au
T28374 67 CMU
T32486 24 hypu
A66734 92 cmu
B76378 71 AU
A47780 45 lanx
A72809 100 pku
A03274 45 hypu
5
1 cmu 192 2
1 au 192 3
3 pku 100 1
4 hypu 81 2
4 lanx 81 2
SC.push_back(school{it->first, countit->first, (int)scoreit->first});
#include <cctype> for(int a=0;a<sch.length();a++){ scha=tolower(scha); }//转小写
cout<<SC.size()<<endl; int num=0; int lastscore=-1; for(int i=0;i<SC.size();i++){ if(SCi.score!=lastscore) num=i+1; lastscore =SCi.score; printf("%d %s %d %d\n",num,SCi.name.c_str(),SCi.score,SCi.count); }
#include<iostream>
#include<map>
#include <cctype>
#include<vector>
#include<algorithm>
using namespace std;
struct school{
string name;
int count;
int score;
};
bool cmp(school s1,school s2){
if(s1.score!=s2.score){
return s1.score>s2.score;
}else if(s1.count!=s2.count){
return s1.count<s2.count;
}else{
return s1.name<s2.name;
}
}
int main(){
int n;
cin>>n;
string id,sch;
double sco;
map<string,int>count;
map<string,double>score;
for(int i=0;i<n;i++){
cin>>id>>sco>>sch;
for(int a=0;a<sch.length();a++){
sch[a]=tolower(sch[a]);
}//转小写
if(id[0]=='A'){
score[sch]+=sco;
} else if(id[0]=='T'){
score[sch]+=1.0*sco*1.5;
}else if (id[0]=='B'){
score[sch]+=1.0*sco/1.5;
}
count[sch]++;
}
vector<school>SC;
for (auto it = score.begin(); it != score.end(); it++)
{
SC.push_back(school{it->first, count[it->first], (int)score[it->first]});
//存进结构体 这里很巧妙
}
sort(SC.begin(),SC.end(),cmp);
cout<<SC.size()<<endl;
int num=0;
int lastscore=-1;
for(int i=0;i<SC.size();i++){
if(SC[i].score!=lastscore) num=i+1;
lastscore =SC[i].score;
printf("%d %s %d %d\n",num,SC[i].name.c_str(),SC[i].score,SC[i].count);
}
return 0;
}