#include<iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<algorithm> #include<map> #include<vector> #include<queue> using namespace std; 注意该考场数组区间为[num-k,num)和其他边界 同分则后面的排名要隔后,局部和全局处理不同,后者按顺序边计算总排名,边输出所有考生的信息 struct Student{ char id[15]; //准考证号 int score; //分数 int location_number; //考场号 int local_rank; //考场内排名 }stu[30010]; bool cmp(Student a,Student b){ if(a.score != b.score ) return a.score>b.score; //先按分数从高到低排序 else return strcmp(a.id,b.id)<0; //若分数相同,则按准考证号从小到大排序 } int main(){ int n,k,num=0; //num为总考生数!!!! scanf("%d",&n); //n为考场数 for(int i=1;i<=n;i++) { scanf("%d",&k); //该考场内的人数 for(int j=0;j<k;j++){ scanf("%s %d",stu[num].id, &stu[num].score); stu[num].location_number=i; //该考生的考场号为i num++; } sort(stu+num-k,stu+num,cmp); //将该考场的考生排序 stu[num-k].local_rank=1; //该考场第1名的local_rank记为1 for(int j=num-k+1;j<num;j++){ //对该考场剩余的考生 if(stu[j].score == stu[j-1].score) { //如果与前一位考生同分 stu[j].local_rank=stu[j-1].local_rank; //loca_rank也相同 }else{ //如果与前一位考生不同,local_rank为该考生前的人数 stu[j].local_rank=j+1-(num-k) ; } } } printf("%d\n",num) ; //输出总考生数 sort(stu,stu+num,cmp); //将所有考生排序 int r=1; //当前考生的排名 for(int i=0;i<num;i++){ if(i>0 && stu[i].score != stu[i-1].score){ r=i+1; //当前考生与上一个考生分数不同时,让r更新为人数+1 } printf("%s ",stu[i].id); printf("%d %d %d\n",r,stu[i].location_number,stu[i].local_rank); } system("pause"); return 0; }