PAT甲级:A1025 PAT Ranking (25 分)

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:

1
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:

1
2
3
4
5
6
7
8
9
10
11
12
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85

Sample Output:

1
2
3
4
5
6
7
8
9
10
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
  • 题意: PAT有n个考场, 题目给出各个考场考生的准考证号,分数,考场, 要求输出考生的总排名信息, 输出内容包括所有考生的准考证号,排名,考场号以及场内排名
  • 分析:
    1. 题目要求对学生的成绩进行排序, 且需要输出学生的相关信息, 因此通过定义 结构体 来存放学生信息
    2. 输出结果包括考场序号,学生总排名以及场内排名, 所以需要进行两次排名, 最好的方式是每次读入一场学生成绩后 立即进行本场成绩的排序 并存至 Student 结构体 中, 故可以得到这样的学生结构体
    3. 输出结果包含总排名, 需要在遍历时计算, 于是在得出总排名后就直接输出而不再存放于结构体中.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      #include <bits/stdc++.h>
      using namespace std;
      const int maxn = 30010;
      struct Student{
      char id[20];
      int score;
      int location_number;
      int rank_number;
      }stu[maxn];
      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,cnt = 0; // cnt(count) 标记考场学生的总个数
      scanf("%d",&n);
      for (int i = 1; i <= n; i++){
      scanf("%d",&k);
      for (int j = cnt; j < cnt + k; j++){
      scanf("%s %d",stu[j].id,&stu[j].score);
      stu[j].location_number = i; // 考场号按照读入的顺序计数
      }
      sort(stu + cnt,stu + cnt + k,cmp);
      stu[cnt].rank_number = 1;
      for (int i = 1; i < k; i++){
      if(stu[cnt + i].score == stu[cnt + i - 1].score)
      stu[cnt + i].rank_number = stu[cnt + i - 1].rank_number;
      else stu[cnt + i].rank_number = i + 1;
      }
      cnt += k;
      }
      sort(stu,stu + cnt,cmp);
      printf("%d\n",cnt);
      int r = 1;
      for (int i = 0; i < cnt; i++){
      if(i > 0 && stu[i].score != stu[i - 1].score) r = i + 1;
      printf("%s %d %d %d\n",stu[i].id,r,stu[i].location_number,stu[i].rank_number);
      }
      }