1095 解码PAT准考证 (25分)
输入样例:
8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999
输出样例:
Case 1: 1 A A107180908108 100 A107180908021 98 A112180318002 98 Case 2: 2 107 3 260 Case 3: 3 180908 107 2 123 2 102 1 Case 4: 2 999 NA
思路:
1.对于类型1,使用结构体数组直接排序即可
2.对于类型2,用数组下标作为考场号记录人数和成绩
3.对于类型3,利用年月日考场号作为数组的四个下标进行输入,输出时将年月日对应的考场信息进行排序即可
4.大数组要定义为全局变量
5.类型2若人数为0要输出NA
首次通过代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int a3[100][13][32][1000]={0}; 5 struct student{ 6 char id[15]; 7 int score; 8 }; 9 10 struct exam{ 11 int num; 12 int p_sum; 13 }; 14 15 void style1(struct student a1[],char x,int a1_sum[]){ 16 switch(x){ 17 case 'A':if(a1_sum[0]==0) { 18 printf("NA"); 19 break; 20 } 21 else { 22 for(int j=0;j<a1_sum[0];j++) { 23 printf("%s %d",a1[j].id,a1[j].score); 24 if(j!=a1_sum[0]-1) printf("\n"); 25 } 26 } 27 break; 28 case 'B':if(a1_sum[1]==0) { 29 printf("NA"); 30 break; 31 } 32 else { 33 for(int j=a1_sum[0];j<a1_sum[0]+a1_sum[1];j++) { 34 printf("%s %d",a1[j].id,a1[j].score); 35 if(j!=a1_sum[0]+a1_sum[1]-1) printf("\n"); 36 } 37 } 38 break; 39 case 'T':if(a1_sum[2]==0) { 40 printf("NA"); 41 break; 42 } 43 else { 44 for(int j=a1_sum[0]+a1_sum[1];j<a1_sum[0]+a1_sum[1]+a1_sum[2];j++) { 45 printf("%s %d",a1[j].id,a1[j].score); 46 if(j!=a1_sum[0]+a1_sum[1]+a1_sum[2]-1) printf("\n"); 47 } 48 } 49 break; 50 default:printf("NA");break; 51 } 52 } 53 54 void style2(int a2_score[],int a2_sum[],char x[]){ 55 int y=0; 56 for(int i=0;i<strlen(x);i++){ 57 if(x[i]>='0'&&x[i]<='9') y=y*10+x[i]-'0'; 58 else { 59 printf("NA");return; 60 } 61 } 62 if(a2_sum[y]==0) printf("NA"); 63 else printf("%d %d",a2_sum[y],a2_score[y]); 64 return ; 65 } 66 67 68 69 int cmp1(const void *a,const void *b){ 70 struct student a1=*(struct student *)a; 71 struct student b1=*(struct student *)b; 72 if(a1.id[0]<b1.id[0]) return -1; 73 else if(a1.id[0]==b1.id[0]){ 74 if(a1.score>b1.score) return -1; 75 else if(a1.score==b1.score){ 76 return strcmp(a1.id,b1.id); 77 } 78 else return 1; 79 } 80 else return 1; 81 } 82 83 int cmp2(const void *a,const void *b){ 84 struct exam a1=*(struct exam *)a; 85 struct exam b1=*(struct exam *)b; 86 if(a1.p_sum>b1.p_sum) return -1; 87 else if(a1.p_sum==b1.p_sum){ 88 if(a1.num<b1.num) return -1; 89 else return 1; 90 } 91 else return 1; 92 } 93 94 void style3(int a3[]){ 95 int num1=0; 96 struct exam s[1000]; 97 for(int i=0;i<1000;i++){ 98 if(a3[i]>0) { 99 s[num1].num=i; 100 s[num1].p_sum=a3[i]; 101 num1++; 102 } 103 } 104 if(num1==0) { 105 printf("NA"); 106 return ; 107 } 108 else { 109 qsort(s,num1,sizeof(struct exam),cmp2); 110 } 111 for(int i=0;i<num1;i++) { 112 printf("%d %d",s[i].num,s[i].p_sum); 113 if(i!=num1-1) printf("\n"); 114 } 115 } 116 117 int main(){ 118 struct student a1[10005]; 119 int a1_sum[3]={0}; 120 int a2_sum[1000]={0}; 121 int a2_score[1000]={0}; 122 123 int sum1,sum2; 124 int num=0; 125 scanf("%d %d",&sum1,&sum2); 126 for(int i=0;i<sum1;i++){ 127 struct student s1;int x=0; 128 scanf("%s %d",s1.id,&s1.score); 129 a1[num++]=s1; 130 for(int j=1;j<4;j++){ 131 x=x*10+s1.id[j]-'0'; 132 } 133 a2_sum[x]++; 134 a2_score[x]+=s1.score; 135 int year=(s1.id[4]-'0')*10+(s1.id[5]-'0'); 136 int month=(s1.id[6]-'0')*10+(s1.id[7]-'0'); 137 int day=(s1.id[8]-'0')*10+(s1.id[9]-'0'); 138 a3[year][month][day][x]++; 139 } 140 qsort(a1,num,sizeof(struct student),cmp1); 141 for(int i=0;i<num;i++) { 142 if(a1[i].id[0]=='A') a1_sum[0]++; 143 else if(a1[i].id[0]=='B') a1_sum[1]++; 144 else if(a1[i].id[0]=='T') a1_sum[2]++; 145 } 146 for(int i=0;i<sum2;i++){ 147 int ins1;char ins2[10]; 148 scanf("%d %s",&ins1,ins2); 149 printf("Case %d: %d %s\n",i+1,ins1,ins2); 150 switch(ins1){ 151 case 1:if(strlen(ins2)==1) style1(a1,ins2[0],a1_sum); 152 else printf("NA"); 153 break; 154 case 2:style2(a2_score,a2_sum,ins2); 155 break; 156 case 3:if(strlen(ins2)!=6) 157 printf("NA"); 158 else{ 159 int flag=1; 160 for(int j=0;j<6;j++) { 161 if(ins2[j]>='0'&&ins2[j]<='9') ; 162 else { 163 flag=0;break; 164 } 165 } 166 if(flag) { 167 int x[1000]; 168 int year=(ins2[0]-'0')*10+(ins2[1]-'0'); 169 int month=(ins2[2]-'0')*10+(ins2[3]-'0'); 170 int day=(ins2[4]-'0')*10+(ins2[5]-'0'); 171 for(int j=0;j<1000;j++) x[j]=a3[year][month][day][j]; 172 style3(x); 173 } 174 } 175 break; 176 default:break; 177 } 178 if(i!=sum2) printf("\n"); 179 } 180 }
参考: