7-4 PAT排名汇总 (25 分)

计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn)。

每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。

现在就请你写一个程序自动归并各个考点的成绩并生成总排名表。

输入格式:

输入的第一行给出一个正整数N(≤100),代表考点总数。随后给出N个考点的成绩,格式为:首先一行给出正整数K(≤300),代表该考点的考生总数;随后K行,每行给出1个考生的信息,包括考号(由13位整数字组成)和得分(为[0,100]区间内的整数),中间用空格分隔。

输出格式:

首先在第一行里输出考生总数。随后输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终排名、考点编号、在该考点的排名。其中考点按输入给出的顺序从1到N编号。考生的输出须按最终排名的非递减顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。

输入样例:

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

输出样例:

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<vector>
#include<cstdio>
#include<set>
#include<map>
#include<string>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
#include<ctype.h>
#include<stack>
#include<queue>
#include<list>
#include<time.h>
#include<sstream>
#define random(x) (rand()%x)
using namespace std;

struct Person{
    string id;      //考号
    int sorce;      //成绩
    int groupID;    //所在组
    int groupPM;    //组排名
    int allPM;      //总排名
}per[30005];

bool cmp(Person a,Person b){
    if(a.sorce==b.sorce)    //成绩相同按考号排名
        return a.id<b.id;
    return a.sorce>b.sorce; //成绩不同按成绩排名
}

int main(){
    int n;
    int sum=0;  //不断更新per的储存长度
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        for(int j=sum;j<sum+x;j++){
            cin>>per[j].id>>per[j].sorce;
            per[j].groupID=i;    //p[j]号学生组号为i
        }
        sort(per+sum,per+sum+x,cmp);    //组排序
        per[sum].groupPM=1;    //组中第一个人排名置为1
        for(int k=1+sum;k<x+sum;k++){    //这个for是为了确定各组中每个人排名
            if(per[k].sorce==per[k-1].sorce){    //相同的分数有相同的排名,就是并列
                per[k].groupPM = per[k-1].groupPM;
            }
            else{
                per[k].groupPM=k-sum+1;    //分数不同则排名+1
            }
        }
        sum+=x;    //更新per[]实际长度
    }
    //总排名和组排名原理相同
    sort(per,per+sum,cmp);
    per[0].allPM=1;
    for(int i=1;i<sum;i++){
        if(per[i].sorce==per[i-1].sorce){
            per[i].allPM=per[i-1].allPM;
        }
        else{
            per[i].allPM=i+1;
        }
    }
    cout<<sum<<endl;
    for(int i=0;i<sum;i++){
        cout<<per[i].id<<" "<<per[i].allPM<<" "<<per[i].groupID<<" "<<per[i].groupPM<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40099908/article/details/83549897