编程能力测试(PAT)由浙江大学计算机科学与技术学院组织。
每次测试都会在多个地区同时进行,测试完成后,将会对成绩进行统计与合并,生成总排名。
你的任务就是编写一个程序,将各地区人员的成绩合并汇总,生成最终排名。
输入格式
第一行包含整数 NN,表示测试将会在 NN 个地区同时进行。
接下来是 NN 个地区的成绩列表。
每个地区的成绩列表,第一行包含整数 KK,表示该地区的测试人数。
接下来 KK 行,每行包含一个学生的考号(1313 位数字)以及该学生的成绩。
输出格式
第一行输出总考生人数。
然后用以下格式输出最终成绩排名列表:
registration_number final_rank location_number local_rank
也就是输出考号,最终排名,地区编号,地区排名。
地区编号按输入顺序依次为 1∼N1∼N。
按照最终排名从前到后的顺序输出每个人的信息。
具有相同分数的人的排名也要相同,相同分数的人,考号较小的先输出。
数据范围
1≤N≤1001≤N≤100,
1≤K≤3001≤K≤300,
分数在 [0,100][0,100] 范围内。
输入样例:
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 <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 110;
struct Student
{
string id;
int grade;
int location_number, local_rank, final_rank;
bool operator< (const Student& t) const
{
if (grade != t.grade) return grade > t.grade;
return id < t.id;
}
};
vector<Student> grades[N];
vector<Student> all;
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++ )
{
int k;
cin >> k;
for (int j = 0; j < k; j ++ )
{
string id;
int grade;
cin >> id >> grade;
grades[i].push_back({id, grade, i});
}
vector<Student> g = grades[i];
sort(g.begin(), g.end());
for (int i = 0; i < g.size(); i ++ )
{
if (!i || g[i].grade != g[i - 1].grade)
g[i].local_rank = i + 1;
else
g[i].local_rank = g[i - 1].local_rank;
all.push_back(g[i]);
}
}
sort(all.begin(), all.end());
for (int i = 0; i < all.size(); i ++ )
if (!i || all[i].grade != all[i - 1].grade)
all[i].final_rank = i + 1;
else
all[i].final_rank = all[i - 1].final_rank;
cout << all.size() << endl;
for (vector<Student>::iterator it=all.begin();it!= all.end();it++)
cout << (*it).id << ' ' << (*it).final_rank << ' ' << (*it).location_number << ' ' << (*it).local_rank << endl;
return 0;
}