计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn)。
每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。
现在就请你写一个程序自动归并各个考点的成绩并生成总排名表。
输入格式:
输入的第一行给出一个正整数N(≤100),代表考点总数。随后给出N个考点的成绩,格式为:首先一行给出正整数K(≤300),代表该考点的考生总数;随后K行,每行给出1个考生的信息,包括考号(由13位整数字组成)和得分(为[0,100]区间内的整数),中间用空格分隔。
输出格式:
首先在第一行里输出考生总数。随后输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终排名、考点编号、在该考点的排名。其中考点按输入给出的顺序从1到N编号。考生的输出须按最终排名的非递减顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。
输入样例:
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
结尾无空行
输出样例:
9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4
结尾无空行
#include <bits/stdc++.h>
using namespace std;
struct Stu{
string id;
int location;
// 重载比较运算符 内部函数排序时会用到
bool operator < (const Stu& s) const{
return id < s.id;
}
};
main() {
int n, k, score, sum = 0, actualRank = 1, tmpRank = 1, actualNum[101], tmpNum[101];
// map容器以score分数为key进行第一次排序 set容器以id第二次排序
map<int, set<Stu>> stu;
cin >> n;
for(int location = 1; location <= n; location++){
cin >> k;
sum += k;
while(k--){
string id;
cin >> id >> score;
// 插入结构体作为set容器key
stu[score].insert({id, location});
}
}
// 总人数
cout << sum << endl;
fill(actualNum, actualNum + 101, 1), fill(tmpNum, tmpNum + 101, 1);
// map容器 分数自动排序为小到大 故用反向迭代器逆序输出
for(auto it = stu.rbegin(); it != stu.rend(); ++it){
// it->second set容器 同分输出
for(auto jt = it->second.begin(); jt != it->second.end(); ++jt){
tmpRank++;
// 考号 总排名 考场号
cout << jt->id << " " << actualRank << " " << jt->location << " ";
// 输出一个考生 考点编号递增
tmpNum[jt->location]++;
cout << actualNum[jt->location] << endl;
}
// 更新总排名及各考点编号
actualRank = tmpRank;
copy(begin(tmpNum), end(tmpNum), begin(actualNum));
}
}
考号(由13位整数字组成)题目这里说考号是整数所以用了long long试试,但最后一个测试点会错不晓得为什么,只能改成string。
经过乙级的历练后偶然回来看这题,想了想知道为什么用 long long 会错了,因为这题的考号可能高位有 0 导致 long long 读取会被消去,如果用 setw() 和 setfill() 来高位补零就可以全部 AC 了。