1025 PAT Ranking (25 分)
问题描述:
输入学生编号,成绩。进行组内排名,全部排名。最后按照学生编号,最终排名,组号,组内排名输出。相同成绩的按照编号的升序排。
解题思路:
先定义学生的结构体,记录编号,成绩,组号,组内排序,最终排序。每输入完一组学生,先利用sort()进行组内排序,然后再编好组内名次。等所有信息输入完毕,再全部一起排序,编号最终的排名。所以其实只要编写好cmp函数就行。
bool cmp(student a, student b)
{
if(a.score != b.score)
return a.score > b.score;
else
{
//学生编号按照字典升序排
if(strcmp(a.registration_number, b.registration_number) < 0)
return true;
else
return false;
}
}
代码:
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
typedef struct student
{
char registration_number[14];
int score;
int final_rank;
int location_number;
int local_rank;
}student;
bool cmp(student a, student b);
int main()
{
int N;
scanf("%d",&N);
student stu[N * 300];
int sum_testees = 0;
int last = 0;
int K;
for(int loc_num = 1; loc_num <= N; loc_num ++)
{
scanf("%d",&K);
for(int i = 0; i < K; i++)
{
scanf("%s %d",(stu + sum_testees)->registration_number,
&stu[sum_testees].score);
stu[sum_testees].location_number = loc_num;
sum_testees++;
}
//组内排序
sort(stu + last, stu + sum_testees, cmp);
stu[last].local_rank = 1;
for(int i = 1; i < sum_testees - last; i++)
{
if(stu[last + i].score == stu[last + i - 1].score)
{
stu[last + i].local_rank = stu[last + i - 1].local_rank;
}
else
{
stu[last + i].local_rank = i + 1;
}
}
last = sum_testees;
}
sort(stu, stu + sum_testees, cmp);
stu[0].final_rank = 1;
printf("%d\n",sum_testees);
printf("%s %d %d %d",stu[0].registration_number,
stu[0].final_rank,
stu[0].location_number,
stu[0].local_rank);
for(int i = 1; i < sum_testees; i++)
{
putchar('\n');
if(stu[i].score == stu[i - 1].score)
stu[i].final_rank = stu[i - 1].final_rank;
else
stu[i].final_rank = i + 1;
printf("%s %d %d %d",stu[i].registration_number,
stu[i].final_rank,
stu[i].location_number,
stu[i].local_rank);
}
return 0;
}
bool cmp(student a, student b)
{
if(a.score != b.score)
return a.score > b.score;
else
{
if(strcmp(a.registration_number, b.registration_number) < 0)
return true;
else
return false;
}
}