1025 PAT Ranking

1025 PAT Ranking

#include 
#include 
#include 
#include 
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; // N:考场数 K:考场内考生数
    int num = 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[num].id, &stu[num].score);
                stu[num].location_number = i; // 考生的考场号
                ++num; // 总考生数加1
            }
            sort(stu + num - K, stu + num, cmp); // 将该考场的考生排序
            stu[num - K].local_rank = 1;

            //对该考场剩余的考生排序
            for(int j = num - K + 1; j < num; ++j){
                if(stu[j].score == stu[j - 1].score){ //如果与前一位考生同分
                    //local_rank相同
                    stu[j].local_rank = stu[j - 1].local_rank;
                }
                else{ // 如果与前一位考生不同分
                    //local_rank为该考生前面的人数
                    stu[j].local_rank = j + 1 - (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 = i + 1; // 当前考生与上一个考生分数不同时
            }
            printf("%s ", stu[i].id);
            printf("%d %d %d\n", r, stu[i].location_number, stu[i].local_rank);
        }

    return 0;
}
	

你可能感兴趣的:(PAT)