基础实验7-2.4 PAT排名汇总 (25分)
计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn)。
每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。
现在就请你写一个程序自动归并各个考点的成绩并生成总排名表。
输入格式:
输入的第一行给出一个正整数N(≤100),代表考点总数。随后给出N个考点的成绩,格式为:首先一行给出正整数K(≤300),代表该考点的考生总数;随后K行,每行给出1个考生的信息,包括考号(由13位整数字组成)和得分(为[0,100]区间内的整数),中间用空格分隔。
输出格式:
首先在第一行里输出考生总数。随后输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终排名、考点编号、在该考点的排名。其中考点按输入给出的顺序从1到N编号。考生的输出须按最终排名的非递减顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。
输入样例:
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
输出样例:
9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4
想法主要参考这篇博客:10-排序5 PAT Judge (25分)
C语言实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct people
{
int grade;//成绩
int kaodian;//考点
int rank;//在该考点的排名
char * num;//准考证号
};
typedef struct people * People;
void Swap(People A, People B)
{
struct people t;
t = *A;
*A = *B;
*B = t;
}
int Cmp(const void *a, const void *b)
{
int k;
if (((struct people*)a)->grade < ((struct people*)b)->grade) //按分数递减排序
k = 1; //返回大于0,a,b位置需交换
else if (((struct people*)a)->grade > ((struct people*)b)->grade)
k = -1; //返回小于0, a,b位置不变
else {
if (strcmp(((struct people*)a)->num, ((struct people*)b)->num) < 0) //按准考证号递增排序;
k = -1;
else
k = 1;
}
return k;
}
int main()
{
int N;//考点总数
scanf("%d", &N);
int i, j, k;
int K;
int totalsum = 0;//记录考生总数
int cnt;
People P;//存放所有考生的记录
P = (People)malloc(40000 * sizeof(struct people));
for (i = 0; i < 40000; i++)
{
P[i].num = (char *)malloc(14 * sizeof(char));
}
for (i = 0; i < N; i++)
{
scanf("%d\n", &K);//该考点考生总数K
People P1;
P1 = (People)malloc(400 * sizeof(struct people));
for (j = 0; j < 400; j++)
{
P1[j].num = (char *)malloc(14 * sizeof(char));
}
for (j = 0; j < K; j++)
{
scanf("%s %d", P1[j].num, &P1[j].grade);
P1[j].kaodian = i + 1;
}
qsort(P1, K, sizeof(struct people), Cmp);//P1数组排序
//求出该考点各考生在该考点的排名并记录在rank内
cnt = 1;
for (j = 0, k = 1; j < K; j++)
{
if (P1[j + 1].grade != P1[j].grade&&j + 1 < K)
{
P1[j].rank = k;
k = k + cnt;
cnt = 1;
}
else
{
P1[j].rank = k;
cnt++;
}
}
//调试
/*
for (j = 0; j < K; j++)
{
printf("%d %d\n", P1[j].grade, P1[j].rank);
}
printf("\n");
*/
//
//将各个考点内的所有考生记录逐个写入数组P内
for (j = totalsum, k = 0; j < totalsum + K; j++, k++)
{
P[j] = P1[k];
}
totalsum = totalsum + K;
}
printf("%d\n", totalsum);//输出考生总数
qsort(P, totalsum, sizeof(struct people), Cmp);//P数组排序
//输出
cnt = 1;
for (i = 0, k = 1; i < totalsum; i++)
{
printf("%s ", P[i].num);//输出考号
if (P[i + 1].grade != P[i].grade&&i + 1 < totalsum)
{
printf("%d ", k);//输出最终排名
k = k + cnt;
cnt = 1;
}
else
{
printf("%d ", k);//输出最终排名
cnt++;
}
printf("%d %d\n", P[i].kaodian, P[i].rank);//输出考点编号和在该考点的排名
}
return 0;
}