计算机程序设计能力考试(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
思路分析:这题麻烦的点在于分数相同的时候排名也要相同,并且还需要考场的排名,此时我们可以运用c++中的sort,并自定义cmp函数。对每个考场分别排序,得到考场的排名,最后在进行总排名,得到总排名。
#include<bits/stdc++.h>
#define N 30010 //方便修改数组大小
using namespace std;
struct Node
{
string s; //学号
int score; //分数
int num1; //总排名
int place; //考场
int num2; //考场排名
}a[N];
int ans=1;//数组的下标
int sum=0; //总共的人数
bool cmp(Node x,Node y) //自定义cmp函数
{
if(x.score!=y.score) //在分数不相同的时候,按照分数从高到低
return x.score>y.score;
else return x.s<y.s; //分数相同时,按照学号从小到大
}
int main()
{
int n,m;
cin>>n;
for(int i=1;i<=n;i++)//此时i就是考场
{
cin>>m;
for(int j=1;j<=m;j++)
{
cin>>a[ans].s>>a[ans].score;
a[ans].place=i;
ans++;
}
sort(a+sum+1,a+sum+m+1,cmp); //因为数组是从1开始的,所以a要多加1
//此时sum是为了分别排序
int num=1;//记录各自考场的名次
a[sum+1].num2=1;//定义第一个名次
for(int q=sum+2;q<sum+m+1;q++)
{
num++;
if(a[q-1].score==a[q].score) //如果分数相同,排名一样
{
a[q].num2=a[q-1].num2;
}
else a[q].num2=num;
}
sum+=m;
}
cout<<sum<<endl;
sort(a+1,a+sum+1,cmp); //总排名
int num=1; //与分别排名的操作相同
a[1].num1=1;
for(int q=2;q<=sum;q++)
{
num++;
if(a[q-1].score==a[q].score)
{
a[q].num1=a[q-1].num1;
}
else a[q].num1=num;
}
for(int i=1;i<=sum;i++)
{
cout<<a[i].s<<" "<<a[i].num1<<" "<<a[i].place<<" "<<a[i].num2<<endl;
}
}