点击链接PAT乙级-AC全解汇总
题目:
每次 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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
输出样例:
5
1 cmu 192 2
1 au 192 3
3 pku 100 1
4 hypu 81 2
4 lanx 81 2
- 1
- 2
- 3
- 4
- 5
- 6
我的代码:
#include
using namespace std;
class School{
public:
School(string name,double sum):name_(name),sum_(sum){};
string name_="";
double sum_=0;
int num_=1;//初始化的时候肯定有一个学生了
};
//记得比较的时候要用int比较,不然case5一直过不去
bool cmp(School a,School b){
if((int)a.sum_!=(int)b.sum_)return (int)a.sum_>(int)b.sum_;
else if(a.num_!=b.num_)return a.num_<b.num_;
else return a.name_<b.name_;
}
int main()
{
int N,sch_id=1;
cin>>N;
map<string,int>map_school_id;
vector<School>vec_school;
for(int i=0;i<N;i++)
{
string stu_id,sch;
double score;
cin>>stu_id>>score>>sch;
transform(sch.begin(), sch.end(), sch.begin(), ::tolower);
if(stu_id[0]=='B')score/=1.5;
else if(stu_id[0]=='T')score*=1.5;
if(map_school_id[sch])//已经有这个学校了,直接加
{
int id=map_school_id[sch]-1;
vec_school[id].sum_+=score;
vec_school[id].num_++;
}
else//还没有这个学校,创建这个学校
{
School temp_sch(sch,score);
map_school_id[sch]=sch_id++;//放入map
vec_school.push_back(temp_sch);//放入vector
}
}
sort(vec_school.begin(),vec_school.end(),cmp);
cout<<vec_school.size()<<endl;
int temp_id=1;
int last=vec_school[0].sum_;
for(int i=0;i<vec_school.size();i++)
{
//与之前输出的成绩一样,则排名也一样
if(int(vec_school[i].sum_)==last)cout<<temp_id;
else//如果成绩不一样,则输出当前序号,更新排名和“之前成绩”
{
cout<<i+1;
temp_id=i+1;
last=vec_school[i].sum_;
}
printf(" %s %d %d\n",vec_school[i].name_.c_str()
,int(vec_school[i].sum_)
,vec_school[i].num_);
}
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
注意: 输入和计算的时候要用double,排序和输出的时候要用int
评论记录:
回复评论: