PAT A1025

来源:互联网 发布:网络分流器怎么连接图 编辑:程序博客网 时间:2024/06/02 03:12

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.

Input Specification:

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.

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:

registration_number final_rank location_number local_rank

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.

Sample Input:
251234567890001 951234567890005 1001234567890003 951234567890002 771234567890004 8541234567890013 651234567890011 251234567890014 1001234567890012 85
Sample Output:
91234567890005 1 1 11234567890014 1 2 11234567890001 3 1 21234567890003 3 1 21234567890004 5 1 41234567890012 5 2 21234567890002 7 1 51234567890013 8 2 31234567890011 9 2 4


这道题的意思是,有n个考场,考场内有k个学生。第一行输入考场数n,然后依次输入第i个考场的人数以及考生的详细信息(准考证号,分数)
输出格式为,先输出考生人数,然后按分数从大到小依次排列,分数相同的,排名相同,再按这个顺序输出考生的准考证号,总排名,考场号,考场内排名

代码如下
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct Student {char id[15];  //准考证号int score;    //分数int location_number;  //考场号int local_rank;  //考场内的排名 } stu[30010];bool cmp(Student a, Student b) {if(a.score != b.score) return a.score > b.score;else return strcmp(a.id, b.id) < 0;}int main() {int n, k, num = 0; //n为考场数量,k为考场人数,num为考生总人数 scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%d", &k);for(int j = 0; j < k; j++){scanf("%s %d", stu[num].id, &stu[num].score);stu[num].location_number = i;num++;}sort(stu + num - k, stu + num, cmp);  //对考场的考生进行排序,注意sort的用法stu[num - k].local_rank = 1;  //此处容易写成 stu[0].local_rank = 1, num - k即为每个考场的第一个学生 for(int j = num - k + 1; j < num; j++){  //此处容易出现的错误同上 if(stu[j].score == stu[j - 1].score) stu[j].local_rank = stu[j - 1].local_rank;else stu[j].local_rank = j + 1 - (num - k); } }printf("%d\n", num);sort(stu, stu + num, cmp);int r = 1; //考生的总体排名for(int i = 0; i < num; i++){if(i > 0 && stu[i].score != stu[i - 1].score) r = i + 1;printf("%s ", stu[i].id);printf("%d %d %d\n", r, stu[i].location_number, stu[i].local_rank);} return 0;}
要注意
1、cmp函数,如果分数相同,先按准考证号从小到大排序
2、用num来存放考生数量,每输入一个考生信息,num就加1,并且这个考场的考生区间为[num - k, num].  (ps:这点是关键,容易出错)