排序,计算rank,输出,先对成绩进行计数然后计算rank
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include <cstdio> #include <cstring> #include <cstdlib> int cnt=0; int n,k; int r[102]={0}; typedef struct{ char id[14]; int score; int rank; int loc; int lrank; }stu; stu s[30000]; int cmp(const void *a1, const void *a2){ stu *p1=(stu *)a1,*p2=(stu *)a2; if(p1->score==p2->score) return strcmp(p1->id,p2->id); return p2->score-p1->score; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&k); for(int j=0;j<101;j++) r[j]=0; r[101]=1; for(int j=0;j<k;j++){ int p=cnt+j; scanf("%s %d",s[p].id,&s[p].score); r[s[p].score]++; s[p].loc=i; } for(int j=100;j>=0;j--) r[j]+=r[j+1]; qsort(s+cnt,k,sizeof(stu),cmp); for(int j=0;j<k;j++,cnt++) s[cnt].lrank=r[s[cnt].score+1]; } qsort(s,cnt,sizeof(stu),cmp); for(int i=0;i<101;i++) r[i]=0; r[101]=1; for(int i=0;i<cnt;i++) r[s[i].score]++; for(int i=100;i>=0;i--) r[i]+=r[i+1]; for(int i=0;i<cnt;i++) s[i].rank=r[s[i].score+1]; printf("%d\n",cnt); for(int i=0;i<cnt;i++) printf("%s %d %d %d\n",s[i].id,s[i].rank,s[i].loc,s[i].lrank); return 0; } |