1085. PAT单位排行 (25)
时间限制
500 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
每次 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
// 时间卡的紧的题最好不用cout输入,不然会超时
// 这里用一个map存储信息,key为学校名,value为一个学校信息结构体,注意学校总分数在没输出前为double,输出时强制转化为int
// 这里排序也是个重点,map以value排序先转化为vetcor,然后再用algorithm中的sort排序
// 最后输出时记得并列的学校编号为同一个
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <stdio.h>
using namespace std;
struct school{
double grade;
int peo_num;
string name;
};
bool cmp(const pair<string,school> &a, const pair<string,school> &b){
if ((int)a.second.grade != (int)b.second.grade)
return a.second.grade > b.second.grade;
if (a.second.peo_num != b.second.peo_num)
return a.second.peo_num < b.second.peo_num;
return a.second.name < b.second.name;
}
int main(int argc, char *argv[]) {
//freopen("1.txt","r", stdin);
int N;
map<string,school> m;
cin >> N;
for (int i = 0; i < N; i++){
string no;
school s;
cin >> no >> s.grade >> s.name;
for (int j = 0; j < s.name.length(); j++)
s.name[j] = tolower(s.name[j]);
if (no[0] == 'B'){
s.grade /= 1.5;
}
else if (no[0] == 'T'){
s.grade *= 1.5;
}
m[s.name].grade += s.grade;
m[s.name].name = s.name;
m[s.name].peo_num++;
}
vector<pair<string,school> > v(m.begin(),m.end());
sort(v.begin(),v.end(),cmp);
int flag = 0;
int grade = -1;
cout << v.size() << endl;
for (int i = 0 ; i < v.size(); i++){
if (grade != (int)v[i].second.grade)
flag = i + 1;
grade = (int)v[i].second.grade;
printf("%d %s %d %d\n",flag,v[i].second.name.c_str(),(int)v[i].second.grade,v[i].second.peo_num);
//cout << flag << " " << v[i].second.name.c_str() << " " << (int)v[i].second.grade << " " << v[i].second.peo_num << endl;
}
return 0;
}
本文介绍了一个PAT考试单位排行榜的算法实现。通过分析考生信息,包括准考证号、得分及所属单位,采用特定加权方式计算单位总分,并按加权总分、考生人数和单位码进行排序。

5276

被折叠的 条评论
为什么被折叠?



