计算机程序设计能力考试(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
这道题主要就是处理那个每个考试的名次的时候要麻烦一点点。借用sort函数可以省掉写排序的部分(感叹c++库函数真好用!!)
就讲一下我之前出错的地方:
1)
在循环里面用这个sort的时候,要考虑排序部分的始末下标!!就比如第一次排序是给(stu[0]→[5])进行排序,第二次是给stu[5]→[9]进行排序,所以这里要处理一下下标的表示方法。
2)
在进行考场内部排名次的时候,要注意i的范围!我做的时候就是这个地方当时写成了for(i=0;i<k;i++),这样写是错的。因为在第二个考场进行排名的时候,是对stu[5]→stu[9]进行排序,所以i应该从st开始(st就是这个考场中的第一个人的下标,)到最后一个人的下标结束。所以在排名的时候,要单独用一个p(从1开始)来给名次。(我写的时候就用成了和总排序的时候一样了,我直接用的i进行排序)。
总的来说就这两个地方比较容易错了。
下面看代码实现:
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
struct student
{
string id;//考号
int kao;//考场
int score;//成绩
int rank;//在考场内的排名
int rankz;//总排名
}stu[30005];
bool cmp(student a,student b)
{
if(a.score ==b.score )//如果两人分数相同个,按考号递增输出
return a.id <b.id ;
else
return a.score >b.score ;
}
int main()
{
int n,cnt=0,s=0;//cnt来记录下标,s记录总数
cin>>n;
for(int i=0;i<n;i++)
{
int k,st;
cin>>k;
s+=k;
for(int j=0;j<k;j++)
{
stu[cnt].kao =i+1;
cin>>stu[cnt].id >>stu[cnt].score ;
cnt++;
}
st=s-k;
//st表示这一个考场的第一个人在stu[]中起始下标,s表示末下标
sort(stu+st,stu+s,cmp);//这个处理非常重要
int p=1;//用来排名次
for(int i=st;i<s;i++)
{
if(stu[i].score ==stu[i-1].score&&i>=1 )//如果和前面一个人分数相同,则名次一样
stu[i].rank =stu[i-1].rank ;
else
stu[i].rank =p;
p++;//记得要加1
}
}
sort(stu,stu+s,cmp);//对整个结构体数组进行排序
for(int i=0;i<s;i++)
{
if(stu[i].score ==stu[i-1].score&&i>=1 )
stu[i].rankz =stu[i-1].rankz ;
else
stu[i].rankz =i+1;//i是下标从0开始的,所以表示排名的时候要+1
}
cout<<s<<endl;
for(int i=0;i<s;i++)
{
cout<<stu[i].id <<' '<<stu[i].rankz<<' '<<stu[i].kao <<' '<<stu[i].rank <<endl;
}
}