A1025. PAT Ranking

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 }
View Code

 

總結: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>。

相關文章
相關標籤/搜索