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\n",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("\n"); 149 } 150 return 0; 151 }