#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct testee {
char regis_num[15];
int score;
int final_rank;
int local_num;
int local_rank;
}testees[30010];
bool cmp(testee a, testee b) {
if (a.score != b.score) return a.score > b.score;
else return strcmp(a.regis_num, b.regis_num) < 0;
}
int main() {
int total_num = 0, N, K, input_idx = 0;
scanf("%d", &N);
for (int i = 0; i < N; i++) {// N是考场数
int start_idx = input_idx, end_idx;
scanf("%d", &K);
total_num += K;
for (int z = 0; z < K; z++) { // K是该考场考生数
scanf("%s %d", &testees[input_idx].regis_num, &testees[input_idx].score);
testees[input_idx].local_num = i + 1;
input_idx++;
}//输入某个区域的选手
end_idx = input_idx;
//立即局部排序
sort(testees + start_idx, testees + end_idx, cmp);
int local_rank = 0;
for (int j = start_idx; j < end_idx; j++, local_rank++) {
if (j == start_idx) {
testees[j].local_rank = 1;
continue;
}
if (testees[j].score != testees[j - 1].score) testees[j].local_rank = local_rank + 1;
else testees[j].local_rank = testees[j - 1].local_rank;
}
}
//整体排序
sort(testees, testees + total_num, cmp);
for (int j = 0; j < total_num; j++) {
if (j == 0) {
testees[j].final_rank = 1;
continue;
}
if (testees[j].score != testees[j - 1].score) testees[j].final_rank = j + 1;
else testees[j].final_rank = testees[j - 1].final_rank;
}
//输出
printf("%d\n", total_num);
for (int i = 0; i < total_num; i++) {
printf("%s %d %d %d\n", testees[i].regis_num, testees[i].final_rank, testees[i].local_num, testees[i].local_rank);
}
return 0;
}
初次使用sort函数对结构体进行排序,还是有很多细节的地方需要注意。【排名从小到大,则分数由高到低】
1. sort函数传入的参数是地址, &a[10]
2.存储13位的考生号的时候,可以用long long, 但是遇到00000003这种情况没法处理,所以使用char[15]来存储可以保持原貌; 然后使用strcmp函数进行比较 【这也是测试点3的考察点】
3.scanf输入的时候,全局索引input_dix,局部z,不要用z输入
4.local_rank,保证每一种情况都能++,放在for里