题目
题目大意
给参加PAT的考生排名,输入给出考场数,再给出每个考场的人数、每个人的编号和分数。要求输出参加考试的总人数以及每个考生的编号、总排名、考场号、考场内的排名。
思路
定义结构体,考场内小数组排序,得到考场内的排名后加入大数组中。最后对大数组排序,得到每个考生的最终排名。注意相同成绩的人,输出顺序按编号从小到大输出。
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct student{
string id;
int score;
int frank;
int lnum;
int lrank;
};
bool cmp(student x, student y){
return x.score == y.score ? x.id < y.id : x.score > y.score;
} // 相同分数时按学号从小到大排列!!!
int main(){
int n;
cin >> n;
vector<student> total; // 总的大数组
for (int i = 1; i <= n; i++){
int m;
cin >> m;
vector<student> v(m + 1); // 每个考场的小数组
for (int j = 1; j <= m; j++){
cin >> v[j].id >> v[j].score;
v[j].lnum = i;
}
sort(v.begin() + 1, v.end(), cmp); // 从1开始排序
v[1].lrank = 1;
for (int j = 2; j <= m; j++){
v[j].score == v[j - 1].score ? v[j].lrank = v[j - 1].lrank : v[j].lrank = j;
}
for (int j = 1; j <= m; j++){
total.push_back(v[j]);
}
}
sort(total.begin(), total.end(), cmp);
total[0].frank = 1;
for (int i = 1; i < (int)total.size(); i++){
total[i].score == total[i - 1].score ? total[i].frank = total[i - 1].frank : total[i].frank = i + 1;
}
cout << (int)total.size() << endl;
for (int i = 0; i < (int)total.size(); i++){
cout << total[i].id << " " << total[i].frank << " " << total[i].lnum << " " << total[i].lrank << endl;
}
return 0;
}