题目翻译:
编程能力测试(PAT)由浙江大学计算机科学与技术学院组织。 每个测试应该在多个地方同时运行,并且排名列表将在测试后立即合并。 现在,您的工作就是编写一个程序来正确合并所有排名列表并生成最终排名。
输入要求:
每个输入文件包含一个测试用例。 对于每种情况,第一行都包含一个正数N(≤100),即测试位置的数量。接下来的N个排名列表,每个等级列表一开始是一个正整数K(≤300),表示受测试者人数,然后每一行是包含注册编号(13位数字)和每个受测试者总分的K行。 一行中的所有数字都用空格分隔。
输出要求:
对于每个测试用例,首先在一行中打印被测试者的总数。 然后按照以下格式打印最终排名列表:
登记号码 最终排名 所在地号码 当地排名
位置的编号从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
对于这道题,虽然自己做的也是满分,但是自己的做法过于繁琐。因此,从B站一个up那里看到简单的做法,特地学习了一下,写了写注释,她的做法确实,尤其一些细节部分,处理得很好。
这是那位up的B站称呼。
附上有注释的代码:
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct stu {
string id;
int place;
int score;
int rank[2];// rank[0]考场排名,rank[1]总排名
};
bool cmp(stu a, stu b) {
if (a.score != b.score)
return a.score > b.score;
// 从大到小排序
else
return a.id < b.id;
// 从小到大排序
}
void giveRank(vector<stu>& v, int now)
{
// now指示现在是考场排名还是总排名
if (v.empty()) return;
int r = 1, preScore = v[0].score;
for (int i = 1; i <= v.size(); i++)
{
if (v[i - 1].score != preScore)
{
r = i;
preScore = v[i - 1].score;
}
v[i - 1].rank[now] = r;
}
}
int main() {
int n, k;
cin>>n;
vector<stu> students; // 长度可变的结构体数组
stu student;
for (int i = 1; i <= n; i++) {
cin>>k;
vector<stu> tmp;
for (int j = 0; j < k; j++) {
cin >> student.id >> student.score;
student.place = i;
tmp.push_back(student); // vector的用法
}
sort(tmp.begin(), tmp.end(), cmp); // 对同一考场的同学进行排序
giveRank(tmp, 0);
students.insert(students.end(), tmp.begin(), tmp.end());
}
sort(students.begin(), students.end(), cmp); // 对所有同学进行排序
giveRank(students, 1);
cout << students.size() << endl;
for (int i = 0; i < students.size(); ++i) {
cout << students[i].id.c_str() << " " <<
students[i].rank[1] << " " << students[i].place << " " <<
students[i].rank[0] << endl;
}
return 0;
}