• 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
  • 相关阅读:
    优先队列实现哈弗曼最小权值
    最小生成树 克鲁斯卡尔(Kruskal)算法求最小生成树
    背包问题------
    背包问题------ 分类: ACM 2015-08-03 20:57 1人阅读 评论(0) 收藏
    Cent Savings (DP) 分类: ACM dp 2015-08-03 14:32 4人阅读 评论(0) 收藏
    Cent Savings (DP)
    Judging Troubles (multiset查找) 分类: ACM STL 2015-08-03 14:27 3人阅读 评论(0) 收藏
    Judging Troubles (multiset查找)
    Joke with permutation
    dubbo源码之二——dubbo入口
  • 原文地址:https://www.cnblogs.com/a982961222/p/12379904.html
Copyright © 2020-2023  润新知