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\n", sum); 79 for (int i = 0; i < sum; i++) 80 printf("%s %d %d %d\n", 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 }