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;
}