1025 PAT Ranking (25 分)

时间:2019-01-19
本文章向大家介绍1025 PAT Ranking (25 分),主要包括1025 PAT Ranking (25 分)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1025 PAT Ranking (25 分)

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名学生
接下来输入K名学生的准考证号和分数
输出时,第一行输出所有考生数,接下来输出格式为:学生的准考证号,最终排名,考场号,考场内排名,
要求最终排名按分数从高到低排序,得分相同的考生有相同的排名,输出顺序按学号递增,

解题思路:在结构体student中存放(准考证号,分数,考场号,考场内排名)
根据题目要求,需要写一个排序函数cmp:当分数不同时,按分数从大到小排序,当分数相同时,按准考证号从小到大排序

对同一考场的考生单独排序的方法,定义int型变量num,用来存放当前获取到的考生人数。
每读入一个考生的信息,就num++;当读取完一个考场的K个考生信息,这个考场的考生所对应的数组下标为[num-k,num-1]


*/
#include <iostream>
#include <cstdio>
#include <string>
#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; //N个考场,每个考场K名考生
    int num=0; //总考生数
    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].id,&stu[num].score);
            stu[num].location_number=i; //该考生的考场号为i
            num++; //总考生数加1

        }
        sort(stu+num-K,stu+num,cmp); //将该考场的考生排序,首元素地址:stu+num-k,尾元素地址的下一个地址:stu+num
        stu[num-K].local_rank=1; //该考场第一名的local_rank记为1
        for(int j=num-K+1;j<num;j++) //对该考场剩余考生排序
        {
            if(stu[j].score==stu[j-1].score) //如果与前一位考生分数相同
            {
                stu[j].local_rank=stu[j-1].local_rank; //与前一位考生的local_rank也相同
            }
            else //如果分数与前一位考生不同
            {
                stu[j].local_rank=j+1-(num-K); //num为所有考场的总人数,K为当前考场人数,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+1,stu[i].local_rank);

    }


    return 0;
}