题目:
题目大意:
PAT考试又N个考场(N<=100),每个考场有K个考生(K<=300),输入考场的各个考生的准考证号和成绩,输出总考生人数,各个考生的准考证号、总排名、考场号、考场内排名。
解题思路:
在结构体类型Student中存放准考证号、考场号、分数和考场排名。读入每个考生的准考证号和成绩,对考生的信息进行存储。每输完一个考场内的考生信息后,就进行排序,得到考生的考场内排名。最后输入完全部考场考生信息后,再对所有考生的排名进行排序,然后一边计算总排名一边输出最后题目要我们输出的信息。
参考代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct Student{
char registration_number[15]; //准考证号
int location_number; //考场号
int score; //分数
int local_rank; //考场排名
}inf[30001];
bool cmp(Student a,Student b)
{
if(a.score != b.score)
return a.score>b.score;
else return strcmp(a.registration_number,b.registration_number) < 0;
}
int main()
{
int j,n,temp = 0,x,sum = 0;
scanf("%d",&n); //n个考场
for(int i = 0;i < n; i++)
{
scanf("%d",&x); //存储考场考生人数
sum += x; //总人数
for(j = temp; j < temp + x; j++)
{
scanf("%s %d",inf[j].registration_number,&inf[j].score);
inf[j].location_number = i + 1;
}
sort(inf + temp,inf + temp + x,cmp);
inf[temp].local_rank = 1; //排序后,考场排名第一位的为第一名
for(j = temp + 1;j < temp + x;j++) //对考场之后的名次进行排序
{
if(inf[j].score == inf[j-1].score)
{
inf[j].local_rank = inf[j-1].local_rank;
}else
{
inf[j].local_rank = j - temp +1;
}
}
temp = j; //此处temp为下一个考场的考生存储的下标位置
}
sort(inf,inf + sum,cmp);
printf("%d\n",sum);
temp = 1; //此时temp记录总名次
printf("%s %d %d %d\n",inf[0].registration_number,temp,inf[0].location_number,inf[0].local_rank);
for(j =1;j<sum;j++)
{
if(inf[j].score == inf[j-1].score)
printf("%s %d %d %d\n",inf[j].registration_number,temp,inf[j].location_number,inf[j].local_rank);
else
{
temp = j+1;
printf("%s %d %d %d\n",inf[j].registration_number,temp,inf[j].location_number,inf[j].local_rank);
}
}
return 0;
}