PAT 1012 1012. The Best Rank (25)

Sample Input
5 6 
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 91 91 91
310105 85 90 90
310101
310102
310103
310104
310105
999999
Sample Output
1 C 
1 M
1 E
1 A
3 A
N/A

题目不难,就是很烦。注意相同排名的处理。

代码

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 typedef struct Student{
 7     char ID[8];
 8     double C,M,E,A;
 9 }Student;
10 int search_rank(double *,double ,int);
11 int search_ID(Student *,char *,int );
12 int main()
13 {
14     double gradeC[2000],gradeM[2000],gradeE[2000],gradeA[2000];
15     Student student[2000];
16     int N,M,i;
17     while(scanf("%d%d",&N,&M) != EOF){
18         for(i=0;i<N;++i){
19             scanf("%s%lf%lf%lf",student[i].ID,&student[i].C,&student[i].M,&student[i].E);
20             student[i].A = (student[i].C + student[i].M + student[i].E) / 3;
21             gradeC[i] = student[i].C;
22             gradeM[i] = student[i].M;
23             gradeE[i] = student[i].E;
24             gradeA[i] = student[i].A;
25         }
26         sort(gradeC,gradeC+N);
27         sort(gradeM,gradeM+N);
28         sort(gradeE,gradeE+N);
29         sort(gradeA,gradeA+N);
30         char searchID[8];
31         int rank,minRank;
32         char minRankOrder;
33         int ID_index;
34         for(i=0;i<M;++i){
35             scanf("%s",searchID);
36             ID_index = search_ID(student,searchID,N);
37             if(ID_index < 0){
38                 printf("N/A ");
39                 continue;
40             }
41             minRank = search_rank(gradeA,student[ID_index].A,N);
42             minRankOrder = 'A';
43             if(minRank == 1){
44                 printf("1 A ");
45                 continue;
46             }
47             rank = search_rank(gradeC,student[ID_index].C,N);
48             if(rank < minRank){
49                 minRank = rank;
50                 minRankOrder = 'C';
51             }
52             if(minRank == 1){
53                 printf("1 C ");
54                 continue;
55             }
56             rank = search_rank(gradeM,student[ID_index].M,N);
57             if(rank < minRank){
58                 minRank = rank;
59                 minRankOrder = 'M';
60             }
61             if(minRank == 1){
62                 printf("1 M ");
63                 continue;
64             }
65             rank = search_rank(gradeE,student[ID_index].E,N);
66             if(rank < minRank){
67                 minRank = rank;
68                 minRankOrder = 'E';
69             }
70             printf("%d %c ",minRank,minRankOrder);                
71         }
72     }
73     return 0;
74 }
75 
76 int search_rank(double *data,double x,int n)
77 {
78     if(n <= 0)
79         return -1;
80     int i = n-1;
81     while(i >= 0 && data[i--] != x);
82     if(data[++i] == x)
83         return n - i;
84     else
85         return -1;
86 }
87 int search_ID(Student *data,char *ID,int n)
88 {
89     if(n <= 0)
90         return -1;
91     int i=0;
92     while(i < n && strcmp(data[i++].ID,ID));
93     if(!strcmp(data[--i].ID,ID))
94         return i;
95     else
96         return -1;
97 }