排序模拟题,练练C/C++排序挺好的。
第一次:
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct{ char number[20]; int score; int final_rank; int local_num; int local_rank; }Info; Info info[30005]; int cmp(const void *m,const void *n){ Info *a=(Info *)m; Info *b=(Info *)n; if(a->score==b->score) return strcmp(a->number,b->number); else return a->score<b->score; } int main(){ int i,j,N,K,off=0; scanf("%d",&N); for(i=1;i<=N;i++){ scanf("%d",&K); for(j=off;j<off+K;j++){ scanf("%s %d",info[j].number,&info[j].score); info[j].local_num=i; } qsort(info+off,K,sizeof(Info),cmp); for(j=off;j<off+K;j++){ if(j!=off&&info[j].score==info[j-1].score) info[j].local_rank=info[j-1].local_rank; else info[j].local_rank=j-off+1; } off=off+K; } qsort(info,off,sizeof(Info),cmp); for(i=0;i<off;i++){ if(i!=0&&info[i].score==info[i-1].score) info[i].final_rank=info[i-1].final_rank; else info[i].final_rank=i+1; } printf("%d\n",off); for(i=0;i<off;i++){ printf("%s %d %d %d\n",info[i].number,info[i].final_rank,info[i].local_num,info[i].local_rank); } return 0; }
第二次:
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct NodeType{ char id[20]; int score; int frank; int lnum; int lrank; }Testee; Testee t[30005]; int cmp(const void *a,const void *b){ Testee* ta=(Testee*)a; Testee* tb=(Testee*)b; if(ta->score==tb->score){ return strcmp(ta->id,tb->id); } else{ return tb->score-ta->score; } } int main(){ int i,j,k,n; int cnt=0; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&k); int tmp=cnt; for(j=0;j<k;j++){ scanf("%s %d",t[cnt].id,&t[cnt].score); t[cnt].lnum=i+1; cnt++; } qsort(t+tmp,cnt-tmp,sizeof(Testee),cmp); t[tmp].lrank=1; for(j=tmp+1;j<cnt;j++){ if(t[j].score==t[j-1].score){ t[j].lrank=t[j-1].lrank; } else{ t[j].lrank=j-tmp+1; } } } qsort(t,cnt,sizeof(Testee),cmp); t[0].frank=1; for(i=1;i<cnt;i++){ if(t[i].score==t[i-1].score){ t[i].frank=t[i-1].frank; } else{ t[i].frank=i+1; } } printf("%d\n",cnt); for(i=0;i<cnt;i++){ printf("%s %d %d %d\n",t[i].id,t[i].frank,t[i].lnum,t[i].lrank); } return 0; }