题目链接
思路:
1. 分考场读入考生数据
2. 对每个考场的考生进行排序,并对local_rank进行赋值
3. 对全部考生进行排序,以变量r记录考生名次
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct Student
{
char id[15];
int score;
int location_num;
int local_rank;
} stu[300010];
bool cmp(Student a, Student b)
{
if (a.score != b.score)
return a.score > b.score;
else
return strcmp(a.id, b.id) < 0;
}
int main()
{
int n, k;
int countStu = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &k);
for (int j = 0; j < k; j++)
{
scanf("%s %d", stu[countStu].id, &stu[countStu].score);
stu[countStu].location_num = i;
countStu++;
}
sort(stu + countStu - k, stu + countStu, cmp);
stu[countStu-k].local_rank = 1;
for (int j = countStu-k+1; j < countStu; j++)
{
if (stu[j].score == stu[j-1].score)
{
stu[j].local_rank = stu[j-1].local_rank;
}
else
{
stu[j].local_rank = j + 1 - (countStu - k);
}
}
}
printf("%d\n", countStu);
sort(stu, stu+countStu, cmp);
int r = 1;
for (int i = 0; i < countStu; i++)
{
if (i > 0 && stu[i].score != stu[i-1].score)
{
r = i+1;
}
printf("%s ", stu[i].id);
printf("%d %d %d\n", r, stu[i].location_num, stu[i].local_rank);
}
return 0;
}