PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分)
7-41 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
题目分析:看题上感觉是要使用归并排序,但我觉得有些麻烦,就用快排来解决了,注意处理分数相同时的情况,对于排名来说,只要让下一个元素的排名等于上一个元素的排名就好了,但对于将相同成绩的考生的考号按递增顺序排序,不仅仅要把最后两个元素互换,更要在所有成绩相同的学生中进行处理,可以在快速排序中增加这种情况,对于成绩相同的学生来说,始终将比他考好小的调整到他的前面,这样递归处理,最后得到的结果就是我们想要的
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<string.h> 4 #include<malloc.h> 5 6 struct Student 7 { 8 char Data[14]; 9 int Score; 10 int ExamPlace; 11 int Sort[2]; 12 }Students[30001]; 13 int Table[30001]; 14 void Swap(int i, int j) 15 { 16 int tmp = Table[i]; 17 Table[i] = Table[j]; 18 Table[j] = tmp; 19 } 20 void InitializeTable(int N) 21 { 22 for (int i = 0; i < N; i++) 23 Table[i] = i; 24 } 25 void Quick_Sort(int start, int end) 26 { 27 if (start >= end - 1) 28 return; 29 int mid = (start + end) / 2; 30 Swap(start, mid); 31 int k = start + 1; 32 for (int j = start + 1; j < end; j++) 33 { 34 if (Students[Table[j]].Score > Students[Table[start]].Score) 35 Swap(k++, j); 36 else if (Students[Table[j]].Score == Students[Table[start]].Score && strcmp(Students[Table[start]].Data, Students[Table[j]].Data) > 0) 37 Swap(k++, j); 38 } 39 Swap(start, k - 1); 40 Quick_Sort(start, k - 1); 41 Quick_Sort(k, end); 42 } 43 void Judget(int start, int end, int i, int sum) 44 { 45 for (int j = start; j < end; j++) 46 { 47 if (j > start && Students[Table[j]].Score == Students[Table[j - 1]].Score) 48 { 49 Students[Table[j]].Sort[i] = Students[Table[j - 1]].Sort[i]; 50 } 51 else 52 Students[Table[j]].Sort[i] = j - sum; 53 } 54 } 55 int main() 56 { 57 int N, K; 58 scanf("%d", &N); 59 int sum = 0; 60 int j = 0; 61 InitializeTable(30001); 62 for (int i = 0; i < N; i++) 63 { 64 scanf("%d", &K); 65 for (int k = sum; k < sum + K; k++) 66 { 67 scanf("%s%d", Students[k].Data, &Students[k].Score); 68 Students[k].ExamPlace = i; 69 } 70 sum += K; 71 Quick_Sort(j, j + K); 72 Judget(j, j + K, 0, sum - K); 73 j = sum; 74 } 75 InitializeTable(30001); 76 Quick_Sort(0, sum); 77 Judget(0, sum, 1, 0); 78 printf("%d ", sum); 79 for (int i = 0; i < sum; i++) 80 printf("%s %d %d %d ", Students[Table[i]].Data, Students[Table[i]].Sort[1]+1, Students[Table[i]].ExamPlace+1, Students[Table[i]].Sort[0]+1); 81 return 0; 82 }