Solution:
这道题的意思是PAT共有n个考场,每个考场有不同数量的考生,每个考场的考生数量为k,考场编号为1~n。每个考生有考号、成绩、所在考场编号、当前考场排名以及所有考场总排名这些信息。我们需要计算每个考生的分区排名,总体排名,最后按总体排名打印考生信息。
代码如下:
//模拟+排序
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int n,k;//n个考场,每个考场k个考生
struct student{
string number;//编号
int final_rank;//最终排名
int location_number;//考场编号
int local_rank;//当地排名
int grade;//成绩
}stu[30005];
bool cmp(student a,student b){
if(a.grade==b.grade){
return a.number<b.number;
}
return a.grade>b.grade;
}
int main(){
cin>>n;
int pos=1;//标记考场编号(从1到n)
int m=0;//表示学生数
for(int i=0;i<n;i++){
cin>>k;
for(int j=0;j<k;j++){
cin>>stu[m].number>>stu[m].grade;
stu[m].location_number=pos;
m++;
}
sort(stu+m-k,stu+m,cmp);
int ans=1;//当前排名
int temp=2;
stu[m-k].local_rank=1;
for(int h=m-k+1;h<m;h++){//计算每个考生的分区排名
if(stu[h].grade==stu[h-1].grade){
stu[h].local_rank=ans;
}else{
ans=temp;
stu[h].local_rank=ans;
}
temp++;
}
pos++;
}
sort(stu,stu+m,cmp);
stu[0].final_rank=1;
int ans=1;
int temp=2;
for(int h=1;h<m;h++){//计算每个考生的全体排名
if(stu[h].grade==stu[h-1].grade){
stu[h].final_rank=ans;
}else{
ans=temp;
stu[h].final_rank=ans;
}
temp++;
}
cout<<m<<endl;
for(int i=0;i<m;i++){
if(i!=m-1){
cout<<stu[i].number<<' '<<stu[i].final_rank<<' '<<stu[i].location_number<<' '<<stu[i].local_rank<<endl;
}else{
cout<<stu[i].number<<' '<<stu[i].final_rank<<' '<<stu[i].location_number<<' '<<stu[i].local_rank;
}
}
return 0;
}