Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhejiang University. Each test is supposed to run simultaneously in several places, and the ranklists will be merged immediately after the test. Now it is your job to write a program to correctly merge all the ranklists and generate the final rank.ios
Input Specification:git
Each input file contains one test case. For each case, the first line contains a positive number N (<=100), the number of test locations. Then N ranklists follow, each starts with a line containing a positive integer K (<=300), the number of testees, and then K lines containing the registration number (a 13-digit number) and the total score of each testee. All the numbers in a line are separated by a space.ide
Output Specification:函數
For each test case, first print in one line the total number of testees. Then print the final ranklist in the following format:spa
registration_number final_rank location_number local_rankcode
The locations are numbered from 1 to N. The output must be sorted in nondecreasing order of the final ranks. The testees with the same score must have the same rank, and the output must be sorted in nondecreasing order of their registration numbers.orm
Sample Input:blog
2 5 1234567890001 95 1234567890005 100 1234567890003 95 1234567890002 77 1234567890004 85 4 1234567890013 65 1234567890011 25 1234567890014 100 1234567890012 85
Sample Output:排序
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 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 typedef struct{ 7 char regist[15]; 8 int final_rank; 9 int location; 10 int local_rank; 11 int grade; 12 }info; 13 bool cmp(info a, info b){ 14 if(a.grade != b.grade) 15 return a.grade > b.grade; 16 else 17 return strcmp(a.regist, b.regist) < 0; 18 } 19 int main(){ 20 int N, K, head = 0, rear = 0; 21 info students[30001]; 22 scanf("%d", &N); 23 for(int i = 0; i < N; i++){ 24 scanf("%d", &K); 25 head = rear; 26 for(int j = 0; j < K; j++){ 27 scanf("%s%d",students[rear].regist, &(students[rear].grade)); 28 students[rear].location = i + 1; 29 rear++; 30 } 31 sort(students + head, students + rear, cmp); 32 students[head].local_rank = 1; 33 for(int j = 1; j < K; j++){ 34 if(students[head + j].grade == students[head + j - 1].grade) 35 students[head + j].local_rank = students[head + j - 1].local_rank; 36 else 37 students[head + j].local_rank = j + 1; 38 } 39 } 40 sort(students, students + rear, cmp); 41 students[0].final_rank = 1; 42 printf("%d\n", rear); 43 printf("%s %d %d %d\n", students[0].regist, students[0].final_rank, students[0].location, students[0].local_rank); 44 for(int i = 1; i < rear; i++){ 45 if(students[i].grade == students[i - 1].grade) 46 students[i].final_rank = students[i - 1].final_rank; 47 else 48 students[i].final_rank = i + 1; 49 printf("%s %d %d %d\n", students[i].regist, students[i].final_rank, students[i].location, students[i].local_rank); 50 } 51 cin >> N; 52 return 0; 53 }
總結:ci
一、題目要求:按照最終排名的非降序排列,若是最終排名相同,則按照id的非降序排列。由樣例可知,分數相同的人排名相同,但相同排名的人均會佔一個位置(若有3我的並列第一, 則第四我的排名爲第四而非第二)。
二、依舊使用struct記錄學生成績和信息。使用sort函數來排序。sort(首元素地址,尾元素的下一個地址,cmp函數),如排序a[0]~a[5],應填sort(a, a + 6, cmp)。在cmp函數中, 若是須要降序排序,則 return a > b,反之亦然。
三、字符串比較大小,能夠使用strcmp(a, b),若a < b,返回負數,a = b返回0,a > b,返回正數。須要include <string.h>。