题目描述
计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn)。
每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。
现在就请你写一个程序自动归并各个考点的成绩并生成总排名表。
输入
输入的第一行给出一个正整数N(≤100),代表考点总数。随后给出N个考点的成绩,格式为:首先一行给出正整数K(≤300),代表该考点的考生总数;随后K行,每行给出1个考生的信息,包括考号(由13位整数字组成)和得分(为[0,100]区间内的整数),中间用空格分隔。
输出
首先在第一行里输出考生总数。随后输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终排名、考点编号、在该考点的排名。其中考点按输入给出的顺序从1到N编号。考生的输出须按最终排名的非递减顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。
输入样例1
2 5 1234567890001 95 1234567890005 100 1234567890003 95 1234567890002 77 1234567890004 85 4 1234567890013 65 1234567890011 25 1234567890014 100 1234567890012 85
输出样例1
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
思路分析
这个问题的关键在于如何解决排名问题,是吧?
很明显我们需要进行两次排名,一次考点内排名,一次总排名。
我们需要两个vector变量,一个存每一次的考点学生,一个存储总学生。
对于每一个考点,先存一次,然后排名一次,先不管相同名次排名,然后找分数相同的把排名也改成相同。
然后把该次考点的并入总考点的。
等所有考点的学生录入完,再排一次名,也是先不管相同名次排名,然后找分数相同的改成相同排名。
AC代码
代码语言:javascript复制#include<bits/stdc .h>
using namespace std;
class Examinee{
public:
int Center,FinalRank,CenterRank,score;
string ID;
void SetData(int center){
Center=center;
cin>>ID>>score;
}
void SetCenterRank(int centerrank){CenterRank=centerrank;}
static bool rules(Examinee&a,Examinee&b){
if(a.score!=b.score)
return a.score>b.score;
return a.ID<b.ID;
}
void print(){cout<<ID<<' '<<FinalRank<<' '<<Center<<' '<<CenterRank<<endl;}
};
vector<Examinee>Yezi;
vector<Examinee>Temp;
int main(){
int N,K,total=0,Center=0;
cin>>N;
while(N--){
Center ;
Temp.clear();
cin>>K;
total=total K;
for(int i=0;i<K;i ){
Examinee testee;
testee.SetData(Center);
Temp.push_back(testee);
}
sort(Temp.begin(),Temp.end(),Examinee::rules);
for(int i=0;i<K;i ){
Temp[i].SetCenterRank(i 1);
if(i&&Temp[i].score==Temp[i-1].score)
Temp[i].SetCenterRank(Temp[i-1].CenterRank);
}
Yezi.insert(Yezi.begin(),Temp.begin(),Temp.end());
}
sort(Yezi.begin(),Yezi.end(),Examinee::rules);
for(int i=0;i<total;i ){
Yezi[i].FinalRank=i 1;
if(i&&Yezi[i].score==Yezi[i-1].score)
Yezi[i].FinalRank=Yezi[i-1].FinalRank;
}
cout<<total<<endl;
for(auto&it:Yezi)
it.print();
}