PAT A1025 PAT Ranking

思路:排序标准为,分数不同时,按分数从大到小进行排序。注意全局排序和局部排序时,分数相同排名也相同,但按照准考证从小到大进行输出。

#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;

typedef struct Student {
    char id[15];
    int score;
    int location_num;
    int local_rank;
} Student;

Student stu[30010];

bool cmp(Student a, Student b) {
     if(a.score != b.score) {
         return a.score > b.score;
     }
    return strcmp(a.id, b.id) < 0;
}

int main() {
    int n, num = 0;
    scanf("%d", &n);
    int k;
    for(int i = 1; i <= n; i++) {
        scanf("%d", &k);
        for(int j = 0; j < k; j++) {
            scanf("%s %d", stu[num].id, &stu[num].score);
            stu[num].location_num = i;
            num++;
        }
        sort(stu + num - k, stu + num, cmp);
        stu[num-k].local_rank = 1;
        for(int i = 1; i < k; i++) {
            if(stu[num-k+i].score == stu[num-k+i-1].score) {
                stu[num-k+i].local_rank = stu[num-k+i-1].local_rank;
            } else {
                stu[num-k+i].local_rank = i + 1;
            }
        }
    }
    printf("%d\n", num);
    sort(stu, stu + num, cmp);
    int global_rank = 1;
    printf("%s %d %d %d\n", stu[0].id, global_rank, stu[0].location_num, stu[0].local_rank);
    for(int i = 1; i < num; i++) {
        if(stu[i].score != stu[i-1].score) {
            global_rank = i + 1;
        }
        printf("%s %d %d %d\n", stu[i].id, global_rank, stu[i].location_num, stu[i].local_rank);
    }
    return 0;
}