PAT乙级1080-----MOOC期终成绩 (25分)

1080 MOOC期终成绩 (25分)

输入样例:

6 6 7
01234 880
a1903 199
ydjh2 200
wehu8 300
dx86w 220
missing 400
ydhfu77 99
wehu8 55
ydjh2 98
dx86w 88
a1903 86
01234 39
ydhfu77 88
a1903 66
01234 58
wehu8 84
ydjh2 82
missing 99
dx86w 81
 

输出样例:

missing 400 -1 99 99
ydjh2 200 98 82 88
dx86w 220 88 81 84
wehu8 300 55 84 84

思路:

1.利用大量空间换时间的思想,先将字符0---9,a---z,A---Z分别编号看作数字0~9,10~35,36~61,然后将所给姓名的倒数3位(2位没试过,感觉不行)的字符转换为数字作为一个三维数组S[62][62][62]的下标,姓名字符不足3位的,不存在的字符看作下标0或用其他方法填入即可

2.相同下标的名字起来,这样在跑前三个循环的时候测试点3应该不会出现超时了,输入成功算是成功了90%,

3.接下来就简单了,遍历S[62][62][62],找及格的人放入另一个数组M[10003],同时对M用直插法,相同成绩按字母序升序排序

要注意的地方:

1.不是只有小写字母和数字,测试点3会有大写字母

2.如果是用名字前3位,测试点3会超时,我猜测试点3的名字前3位都是dkb(大坑B),也可以尝试用其他的位置

3.成绩四舍五入

总结:

我认为本题难在输入,因为名字是无序的,因此输入期中期末成绩时要进行判断,找到这个名字,若选择暴力等方式,测试点3会一直出现超时

 首次通过代码:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 
  5 #define prime_num 30011
  6 
  7 typedef struct student{
  8     char name[30];
  9     int G_p;
 10     int G_mid_term;
 11     int G_final;
 12     int final_score;
 13     struct student *next;
 14 }student,*s;
 15 s inital_student(){
 16       s s1=(s)malloc(sizeof(student));
 17       s1->G_p=-1;
 18       s1->G_mid_term=-1;
 19       s1->G_final=-1;
 20       s1->final_score=-1;
 21       s1->next=NULL;
 22       return s1;
 23 }
 24 
 25 void sort(s quali[],int num,s s3){
 26            quali[num]=s3;
 27            for(int i=num;i>0;i--){
 28                if(quali[i]->final_score>quali[i-1]->final_score) {
 29                    s s4=quali[i];
 30                    quali[i]=quali[i-1];
 31                    quali[i-1]=s4;
 32                }
 33                else if(quali[i]->final_score==quali[i-1]->final_score&&strcmp(quali[i]->name,quali[i-1]->name)<0){
 34                     s s4=quali[i];
 35                    quali[i]=quali[i-1];
 36                    quali[i-1]=s4;
 37                }
 38                else break;
 39            }
 40        
 41 }
 42 int xyz(char a[],int num,int x){
 43     if(x<0) return 61;
 44     else {
 45         if(a[x]>='0'&&a[x]<='9') return a[x]-'0';
 46         else if(a[x]>='a'&&a[x]<='z') return a[x]-'a'+10;
 47         else return a[x]-'A'+36;
 48     }
 49 }
 50 int main(){
 51      int P,M,N;
 52     scanf("%d %d %d",&P,&M,&N);
 53     int num=0;char name[30];int score;
 54     s s1[62][62][62]={NULL};
 55     s quali[10003]={NULL};
 56  for(int i=0;i<P;i++){ 
 57          int a,b,c;
 58         scanf("%s %d",name,&score);
 59         if(score>=200){
 60         a=xyz(name,strlen(name),strlen(name)-1);
 61         b=xyz(name,strlen(name),strlen(name)-2);
 62         c=xyz(name,strlen(name),strlen(name)-3);   
 63         s s2=inital_student();    
 64         strcpy(s2->name,name);
 65         s2->G_p=score;
 66          if(s1[a][b][c]==NULL) s1[a][b][c]=s2;
 67          else {
 68             s s3=s1[a][b][c];
 69             while(s3->next!=NULL) s3=s3->next;
 70             s3->next=s2;
 71             // s2->next=s1[a][b][c];
 72             // s1[a][b][c]=s2;
 73          }
 74         }
 75     }
 76     for(int i=0;i<M;i++){
 77         int a,b,c;
 78         scanf("%s %d",name,&score);
 79         a=xyz(name,strlen(name),strlen(name)-1);
 80         b=xyz(name,strlen(name),strlen(name)-2);
 81         c=xyz(name,strlen(name),strlen(name)-3);   
 82         if(s1[a][b][c]!=NULL)  {
 83             s s3=s1[a][b][c];
 84             while(s3!=NULL){
 85                 if(strcmp(name,s3->name)==0) {
 86                   s3->G_mid_term=score;
 87                   break;
 88                 }
 89                 s3=s3->next;
 90             }
 91         }  
 92         }   
 93     for(int i=0;i<N;i++){
 94         int a,b,c;
 95         scanf("%s %d",name,&score);
 96         a=xyz(name,strlen(name),strlen(name)-1);
 97         b=xyz(name,strlen(name),strlen(name)-2);
 98         c=xyz(name,strlen(name),strlen(name)-3);   
 99         if(s1[a][b][c]!=NULL)  {
100             s s3=s1[a][b][c];
101             while(s3!=NULL){
102                 if(strcmp(name,s3->name)==0) {
103                   s3->G_final=score;
104                   if(s3->G_mid_term<=s3->G_final) s3->final_score=s3->G_final;
105                   else if(s3->G_final==-1) s3->final_score=-1;
106                   else if(s3->G_mid_term==-1&&s3->final_score<100) s3->final_score=-1;
107                   else {
108                       s3->final_score=s3->G_mid_term*0.4+s3->G_final*0.6+0.5;
109                   }
110                   break;
111                 }
112                 s3=s3->next;
113             }
114         }        
115     }
116     //测试用 
117 //    for(int i=0;i<62;i++)
118 //       for(int j=0;j<62;j++)
119 //          for(int k=0;k<62;k++){
120 //          
121 //        if(s1[i][j][k]==NULL) continue;
122 //        else {
123 //            s s3=s1[i][j][k];
124 //            while(s3!=NULL){
125 //                 printf("%s %d %d %d %d
",s3->name,s3->G_p,s3->G_mid_term,s3->G_final,s3->final_score);
126 //                 s3=s3->next;
127 //            }
128 //        }
129 //    }
130         for(int i=0;i<62;i++)
131            for(int j=0;j<62;j++)
132              for(int k=0;k<62;k++){
133               if(s1[i][j][k]==NULL) continue;
134                 else {
135                     s s3=s1[i][j][k];
136                     while(s3!=NULL){
137                   if(s3->final_score<60) ;
138                    else {
139                     sort(quali,num,s3);
140                     num++;
141                 }
142                 s3=s3->next;
143             }
144           }
145     }
146         for(int i=0;i<num;i++){
147         printf("%s %d %d %d %d",quali[i]->name,quali[i]->G_p,quali[i]->G_mid_term,quali[i]->G_final,quali[i]->final_score);
148         if(i!=num-1) printf("
");
149     }
150     return 0;
151 }
View Code
原文地址:https://www.cnblogs.com/a982961222/p/12379904.html