zl程序教程

您现在的位置是:首页 >  其它

当前栏目

2 PAT排名汇总

汇总 PAT 排名
2023-09-14 09:01:32 时间

2 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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
C++ (g++)

思路:

用结构体来存储学生信息:id、成绩、考点、考点排名、排名。
compare的规则是:如果分数相同那么按照id升序排,否则按照分数从高到低排。
输入每个考场的学生信息,进行排序 ,求得考场排名。
对所有学生进行排序,最后按格式输出。

AC代码:

#include<bits/stdc++.h>
using namespace std;
struct student{
    char id[13];
    int score;
    int kd;
    int kdpm;
    int pm;
}stu[30010];
bool cmp(student s1,student s2){
    if(s1.score==s2.score)
        return strcmp(s1.id,s2.id)<0;
    return s1.score>s2.score;
}
int main(){
    int n,k,sum=0;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>k;
        for(int j=sum;j<sum+k;j++){
            cin>>stu[j].id>>stu[j].score;
            stu[j].kd=i+1;
        }
        sort(stu+sum,stu+sum+k,cmp);
        int temp=0;
        for(int j=0;j<k;j++){
            if(j==0||stu[sum+j].score!=stu[sum+j-1].score)
                temp=j+1;
            stu[j+sum].kdpm=temp;
        }
        sum+=k;
    }
    sort(stu,stu+sum,cmp);
    int temp=0;
    for(int j=0;j<sum;j++){
        if(j==0||stu[j].score!=stu[j-1].score)
            temp=j+1;
        stu[j].pm=temp;
    }
    cout<<sum<<endl;
    for(int i=0;i<sum;i++){
        cout<<stu[i].id<<" "<<stu[i].pm<<" "<<stu[i].kd
            <<" "<<stu[i].kdpm<<endl;
    }
}