PAT:1025. PAT Ranking (25) AC

#include<stdio.h>
#include<string.h>          //【warning】刚开始少了这个头文件,但是VS2010中被系统自动优化没有察觉 #include<algorithm> using namespace std; struct Student { char ID[15]; int score,final_rank,location_number,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,I=0; //I记录所有STU学生个数 scanf("%d",&n); for(int t=1 ; t<=n ; ++t) //n个考场 { int k; scanf("%d",&k); for(int i=0 ; i<k ; ++i) { scanf("%s %d",&STU[I+i].ID, &STU[I+i].score); //记录ID,分数 STU[I+i].location_number=t; //记录考场号 } sort(STU+I,STU+I+k,cmp); STU[I].local_rank=1; for(int i=1 ; i<k ; ++i) //记录场内排名 { if(STU[I+i].score==STU[I+i-1].score) STU[I+i].local_rank=STU[I+i-1].local_rank; //和前一个同学名次相同 else STU[I+i].local_rank=i+1; //否则排名为i+1 } I+=k; //到下一个考场,I从k个考生之后开始算 } sort(STU,STU+I,cmp); STU[0].final_rank=1; for(int i=1 ; i<I ; ++i) //总排名 { if(STU[i].score==STU[i-1].score) STU[i].final_rank=STU[i-1].final_rank; //和前一个同学名次相同 else STU[i].final_rank=i+1; //否则排名为i+1 } printf("%d\n",I); for(int i=0 ; i<I ; ++i) printf("%s %d %d %d\n",STU[i].ID,STU[i].final_rank,STU[i].location_number,STU[i].local_rank); return 0; }
posted on 2015-03-01 13:39  Evence  阅读(166)  评论(0编辑  收藏  举报