https://pintia.cn/problem-sets/994805260223102976/problems/994805260353126400。
每次 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
第一反应又是一个排序题。仔细一看还真的是一个排序题,等一下,题目是先按照学校统计再将统计后的成绩排序。那么直接用数组来排序是不行的。只能用map来排序。好吧,那就干。结果提交代码,有错误。WTF,这么简单的题目怎么可能。再次认证阅读题目。好吧,我的错。样例输出没有仔细看。...。解决样例输出,再次提交,WTF还是错。然后再次仔细看题目,我去,还有一个坑点啊。总分排序的时候,是整数部分排序。能不能再坑一点,还是自己语文不过关。
好了,正式总结如下。
本题难点:先按学校统计,统计完成后,再按照要求对统计结果进行排序。
本题坑点:总分排序的时候,是整数部分排序。
本题考点:STL Map自定义排序
//1085 PAT单位排行
//https://pintia.cn/problem-sets/994805260223102976/problems/994805260353126400
#include
#include
#include
#include
#include
#include
#include
struct PTASCORE {
int cnts;//人数
double score;//加权分数
PTASCORE() : cnts(0), score(0) {}
PTASCORE(int a, double b) : cnts(a), score(b) {}
};
bool mycmp(const std::pair
if ((int)x.second.score != (int)y.second.score) {
//加权总分
return (int)x.second.score > (int)y.second.score;
} else {
if (x.second.cnts != y.second.cnts) {
//考生人数升序
return x.second.cnts < y.second.cnts;
} else {
//单位码的字典序
return x.first < y.first;
}
}
}
int main() {
int n;
scanf("%d", &n);
int i, j;
std::map
int idx = 0;
char lv[8];
double num;
char arr[8];
for (i=0; i scanf(" %s %lf %s", lv, &num, arr); if ('B'==lv[0]) { num /= 1.5; } else if ('T'==lv[0]) { num *= 1.5; } for (j=0; arr[j]!=0; j++) { if (arr[j]>='A'&&arr[j]<='Z') { arr[j]+=32; } } data[arr].score += num; data[arr].cnts++; } //STL Map自定义排序 std::vector std::sort(myvec.begin(), myvec.end(), mycmp); //输出 int rank = 1; int old_score = 0; int size = myvec.size(); int value; printf("%d\n", size); for (i=0; i value = (int)myvec[i].second.score; if (old_score != value) { rank = i+1; old_score = value; } printf("%d %s %d %d\n", rank, myvec[i].first.c_str(), value, myvec[i].second.cnts); } return 0; }