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 (≤), the number of test locations. Then N ranklists follow, each starts with a line containing a positive integer K (≤), 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

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

struct student{
    char id[13];//准考证号
    int score;//分数
    int local_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是总人数,每次输入一个人,就+1
    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].local_number = i;//考场号信息
            num++;
        }

        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)//分数相同则名次相同
                stu[j].local_rank = stu[j-1].local_rank;
            else//否则名排在他前面的人的个数+1
                stu[j].local_rank = j - (num - k)+1;
        }
    }//接下来计算总的排名

    sort(stu,stu+num,cmp);
    int r = 1;//r的总的排名
    printf("%d\n",num);//输出总人数
    for(int i=0;i<num;i++)
    {
        if(i>0&&stu[i].score != stu[i-1].score)
            r = i+1;
        printf("%s %d %d %d\n",stu[i].id,r,stu[i].local_number,stu[i].local_rank);
    }

    return 0;


}

 

 

第二种解法 使用vector

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

struct stu{
    long long no;
    int score;
    int finrank;
    int loca;
    int locarank;
};

bool cmp1(stu a, stu b)
{
    return a.score!=b.score ? a.score>b.score : a.no < b.no;
}

int main()
{
    int n,m;
    scanf("%d",&n);
    vector<stu> fin;//总的学生数向量
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&m);
        vector<stu> v(m);//每个考场的学生数向量
        for(int j=0;j<m;j++)
        {
            scanf("%lld %d",&v[j].no,&v[j].score);//输入信息
            v[j].loca = i;
        }
        sort(v.begin(),v.end(),cmp1);//考场内排序下
        v[0].locarank = 1;
        fin.push_back(v[0]);//考场第一的先放任总的学生向量中
        for(int j=1;j<m;j++)//标记考场的排名
        {
            if(v[j].score==v[j-1].score)
                v[j].locarank = v[j-1].locarank;
            else
                v[j].locarank = j +1;

            fin.push_back(v[j]);
        }
    }

    sort(fin.begin(),fin.end(),cmp1);
    fin[0].finrank = 1;
    for(int j=1;j<fin.size();j++)//标记总的排名
    {
        fin[j].finrank = (fin[j].score == fin[j-1].score ? fin[j-1].finrank : j+1);

    }

    printf("%d\n",fin.size());
    for(int i=0;i<fin.size();i++)
    {
        printf("%013lld %d %d %d\n",fin[i].no, fin[i].finrank, fin[i].loca, fin[i].locarank);


    }

    return 0;

}

 

 
posted @ 2020-03-30 21:32  清明道人  阅读(229)  评论(0编辑  收藏  举报