A1025.PAT Ranking

题目如下:

Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhejiang University. Each test is supposed to run simultaneously in several places, and the ranklists will be merged immediately after the test. Now it is your job to write a program to correctly merge all the ranklists and generate the final rank.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive number N (≤100), the number of test locations. Then N ranklists follow, each starts with a line containing a positive integer K (≤300), the number of testees, and then K lines containing the registration number (a 13-digit number) and the total score of each testee. All the numbers in a line are separated by a space.

Output Specification:

For each test case, first print in one line the total number of testees. Then print the final ranklist in the following format:

registration_number final_rank location_number local_rank

The locations are numbered from 1 to N. The output must be sorted in nondecreasing order of the final ranks. The testees with the same score must have the same rank, and the output must be sorted in nondecreasing order of their registration numbers.

Sample Input:

2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85

Sample Output:

9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4

题目分析:

题目给出n个考场,每个考场有若干数量的考生。依次给出各考场考生数量k、各考生的考号及成绩,要求输出考生总人数,并且将所有考生按照成绩从高到低排序,按顺序输出各考生的考号、最终排名、考场号和考场内排名。

按照题意可以先建立考生结构体类型testee(根据题目条件将结构体类型数组容量定义为30010),将考号、成绩、考场号和考场内排名作为结构体的内部属性。每输入一个考场的考生信息时,更新其考号、成绩和考场号,再对考场内部考生排序后依次更新其考场内排名。当所有考场的考生信息全部输入后,对所有考生按成绩排序,最后依次按题目要求格式输出学生信息。

本题需要使用sort函数进行排序操作(注意sort函数操作的下标区间为[l, r)),并按照题目要求编写cmp函数(sort函数属于algorithm头文件)。题目要求考生按成绩从高到低排序,相同成绩时按照考号从小到大排序,因此cmp函数需要满足成绩不同时return a.score > b.score,成绩相同时return strcmp(a.registration, b.registration) < 0(strcmp函数属于cstring头文件)。

此外,对于成绩相同的考生排名应该相同,因此在排序后计算排名时使用rank变量记录当前排名,如果当前考生与上一个考生成绩相同则rank不变,否则rank等于当前考生序号。

题解:

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

struct testee{
    char registration[15];
    int score;
    int location;
    int local_rank;
}testees[30000];    //声明一个结构体变量数组

bool local_cmp(testee a, testee b){
    if(a.score != b.score)
        return a.score > b.score;    //按成绩从高到低排序
    else
        return strcmp(a.registration, b.registration) < 0;    //成绩相同按准考证号增序
}

int main(){
    int n, count = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        int k;    //当前考场考生人数
        scanf("%d", &k);
        for(int j = 0; j < k; j++){    //依次输入各考生的考号和成绩
            scanf("%s %d", testees[count].registration, &testees[count].score);
            testees[count].location = i + 1;    //输入当前考生所在考场号
            count++;    //下一个考生
        }
        sort(testees + count - k, testees + count, local_cmp);    //对同一考场考生排序
        int r = 1;
        for(int j = 0; j < k; j++){    //成绩相同的考生名次应当一致
            if(j > 0 && testees[count - k + j].score != testees[count - k + j - 1].score)
                r = j + 1;
            testees[count - k + j].local_rank = r;
        }
    }
    sort(testees, testees + count, local_cmp);    //所有考生排序
    printf("%d\n", count);
    int rank = 1;    //记录当前考生排名
    for(int i = 0; i < count; i++){    //依次输出各考生信息
        printf("%s ", testees[i].registration);
        if(i > 0 && testees[i].score != testees[i - 1].score)
            rank = 1 + i;    //如果成绩与上一个考生不一致,排名为当前名次
        printf("%d %d %d\n", rank, testees[i].location, testees[i].local_rank);
    }
    return 0;
}

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值