就不放原题,直接给自己的思路和代码啦
思路:这题的难点在于要输出准考证号,排名,考场号,考场内排名,即需要知道两个排名,需要数据结构部分考虑一下,我的想法是在除了全体排名之外,其他数据都存储在一个结构体中,并对每组输入的时候,就对结构体中的组内排名进行整理,最后再进行整体的排名
#include<stdio.h>
#include<string.h>
//PAT Rangking
//首先创建一个结构体来存 准考证号,分数,考场号,考场排名
struct Student{
int z;//准考证
int sc;//分数
int num;//考场号
int rank;//考场排名
}stu[50];
//在写一个cmp函数
bool cmp(Student a,Student b){
//先比分数,分数相同情况之下,比准考证号这个是从小到大
if(a.sc!=b.sc)
return a.sc>b.sc
else
return a.z<b.z;
}
int main()
{
//首先是输入一个分组数量
int n;
int sum=0;//之后用来输出总数
scanf("%d",&n);
while(n--){
int i;
int j=1;//这是考场号
int zu;//输入每组学生数
scanf("%d",&zu);
for(i=sum;i<zu;i++){//这个循环是为的每次输入的值可以改变,再这个for循环进行组内排序
scanf("%d%d",&stu[i].z,&stu[i].sc);
stu[i].num=j;//输入考场号
}
//开始组内排名
sort(stu+sum,stu+zu+sum,cmp);
//拍好之后 开始输入组内排名,比较方法,如果他和前一位的分数相同,那么rank就直接赋值,反之rank加一
for(i=sum+1;i<zu;i++){
//先把第一个设置为1
stu[sum].rank=1;
if(stu[i].sc==stu[i-1].sc)
stu[i].rank=stu[i-1].rank;
else
stu[i].rank++;
}
sum+=zu;
j++;
}
//组内排名结束,开始输出组外排名,先进行排序
sort(stu,stu+sum,cmp);
//先输出总人数
printf("%d\n",sum);
int i;
int r=1;//即第一名
//先输入第一名,依次是准考证号,排名,考场号,考场内排名
printf("%d %d %d %d\n",stu[0].z,r,stu[0].num.stu[0].rank);
for(i=1;i<sum;i++){//和组内排序排序有点相似,如果他和前一位的分数相同,那么rank就直接赋值,反之rank加一
if(stu[i].sc==stu[i-1].sc)
//r不变
printf("%d %d %d %d\n",stu[i].z,r,stu[i].num.stu[i].rank);
else{
r++;
printf("%d %d %d %d\n",stu[i].z,r,stu[i].num.stu[i].rank);
}
}
return 0;
}