1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm>//这是sort函数所在的库 4 using namespace std; 5 struct Student{ 6 char id[15]; //id 7 int score; //分数 8 int location_number;//考场号 9 int location_rank; //考场排名 10 }stu[30010]; 11 12 bool cmp(Student student1,Student student2){ 13 if(student1.score!=student2.score){ 14 return student1.score>student2.score; 15 }else{ 16 return strcmp(student1.id,student2.id)<0; 17 } 18 } 19 20 int main(){ 21 int n; //考场的数量 22 int num; //某个考场考生的人数 23 int k=0; //考生总人数 24 scanf("%d",&n); //输入考场数量 25 for(int i=0;i<n;i++){ 26 scanf("%d",&num); //输入该考场的人数 27 for(int j=0;j<num;j++){ 28 scanf("%s %d",stu[k].id,&stu[k].score); //输入考生的ID和分数 29 stu[k].location_number = i+1; //获取考生的考场 30 k++; 31 } 32 sort(stu+k-num,stu+k,cmp); //sort函数排序 33 stu[k-num].location_rank = 1; 34 for(int j=1;j<num;j++){ 35 if(stu[k+j-num].score==stu[k+j-num-1].score){ 36 stu[k+j-num].location_rank = stu[k+j-num-1].location_rank;//同分和上一个同学同排名 37 }else{ 38 stu[k+j-num].location_rank = j+1; //不同分就是当前循环的单位加1 39 } 40 } 41 } 42 sort(stu,stu+k,cmp); 43 printf("%d",k);//输出考生总人数 44 int rank=1; //当前排名 45 printf("%s %d %d %d ",stu[0].id,rank,stu[0].location_number,stu[0].location_rank);//只有一条数据时候输出一条 46 for(int i=1;i<k;i++){ 47 printf("%s ",stu[i].id); 48 if(stu[i].score==stu[i-1].score){ 49 printf("%d %d %d ",rank,stu[i].location_number,stu[i].location_rank); 50 }else{ 51 printf("%d %d %d ",i+1,stu[i].location_number,stu[i].location_rank); 52 rank=i+1; 53 } 54 } 55 }