PAT A1025 考生排名问题

题目要求:有n个考场,每个考场有若干个考生,现给出各个考场中考生的准考证号与分数,按照分数从高到低排序,并按顺序输出所有考生的准考证号,排名,考场号以及所在的考场排名

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Student {
    char id[15];
    int score;
    int location_number;
    int local_rank;
}stu[30010];
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, num = 0;//num为总考生的人数,n为考场数,k为该考场内的人数。
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", k);
        for (int j = 0; j < k; j++) {
            scanf("%s%d", stu[num], &stu[num].score);
            stu[num].location_number = i;//该学生的考场号为i
            num++;
        }
        sort(stu + num - k, stu + num, cmp);//将每一个考场的学生排序
        stu[num - k].local_rank = 1;
        for (int j = num - k + 1; j < num; j++) {//num-k+1是该考场第2名学生,num代表到该考场为止的总人数。
            if (stu[j].score == stu[j - 1].score) {
                stu[j].local_rank = stu[j - 1].local_rank;
            }
            else
            {
                stu[j].local_rank = j + 1 - (num - k);//因为local_rank 是本考场的排名所以应该再减去个num-k;
            }
        }
    }
    printf("%d\n", num);//输出考生总人数。
    sort(stu, stu + num, cmp);
    int r = 1;
    for (int i = 0; i < num; i++) {
        if (i>0&&stu[i].score != stu[i - 1].score) {
            r = r + 1;//代表考生总排名
        }
        printf("%s", stu[i].id);
        printf("%d %d %d\n", r, stu[i].location_number, stu[i].local_rank);
    }
    return 0;
}

 

上一篇:python解析XML最常见的有三种方法有?


下一篇:村村通