PAT(乙级)2019年春季考试 7-5 校庆 (25分)
7-5 校庆 (25分)
2019 年浙江大学将要庆祝成立 122 周年。为了准备校庆,校友会收集了所有校友的身份证号。现在需要请你编写程序,根据来参加校庆的所有人士的身份证号,统计来了多少校友。
输入格式:
输入在第一行给出不超过 1 的正整数 N,随后 N 行,每行给出一位校友的身份证号(18 位由数字和大写字母X组成的字符串)。题目保证身份证号不重复。
随后给出前来参加校庆的所有人士的信息:首先是一个不超过 1 的正整数 M,随后 M 行,每行给出一位人士的身份证号。题目保证身份证号不重复。
输出格式:
首先在第一行输出参加校庆的校友的人数。然后在第二行输出最年长的校友的身份证号 —— 注意身份证第 7-14 位给出的是 yyyymmdd
格式的生日。如果没有校友来,则在第二行输出最年长的来宾的身份证号。题目保证这样的校友或来宾必是唯一的。
输入样例:
5
372928196906118710
610481197806202213
440684198612150417
13072819571002001X
150702193604190912
6
530125197901260019
150702193604190912
220221196701020034
610481197806202213
440684198612150417
370205198709275042
输出样例:
3
150702193604190912
代码讲解:此题最好还是用c++的map,比较方便,由于我想用c写只能
绕远了。。舍弃了hash,利用排序和二分查找,缩短时间。。。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 typedef struct //设置结构体把年龄但弄出来方便比较 5 { 6 char a[20]; 7 int age; 8 9 }ren; 10 int find(ren a[],ren b,int count) //二分法找,来的人当中是不是校友。 11 { 12 int flag=0,low=0,high=count-1,mid; 13 while(low<=high) 14 { 15 mid=(low+high)/2; 16 flag=strcmp(a[mid].a,b.a); 17 if(flag==0) 18 { 19 return mid; 20 } 21 else 22 { 23 if(flag>0) 24 { 25 high=mid-1; 26 } 27 else 28 { 29 low=mid+1; 30 } 31 } 32 33 } 34 return -1; 35 36 } 37 int cmp(const void *a,const void *b) //为了二分查找必须排序 38 { 39 ren *c=(ren *)a; 40 ren *d=(ren *)b; 41 return strcmp(c->a,d->a); 42 } 43 int main() 44 { 45 int n,m,i,j,count=0,age,max_m=1e9,max=1e9,max_i,max_m_i,flag; 46 scanf("%d",&n); 47 ren xiao[n]; 48 for(i=0;i<n;i++) 49 { 50 scanf("%s",xiao[i].a); 51 age=0; 52 for(j=6;j<14;j++) //将出生年月日弄出来,放在age里 53 { 54 age=age*10+xiao[i].a[j]-'0'; 55 } 56 xiao[i].age=age; 57 } 58 scanf("%d",&m); 59 ren laibin[m]; 60 qsort(xiao,n,sizeof(ren),cmp); 61 for(i=0;i<m;i++) 62 { 63 scanf("%s",laibin[i].a); 64 flag=find(xiao,laibin[i],n); 65 age=0; 66 for(j=6;j<14;j++) 67 { 68 age=age*10+laibin[i].a[j]-'0'; 69 } 70 laibin[i].age=age; 71 if(flag!=-1) 72 { 73 count++; 74 if(max>xiao[flag].age) 75 { 76 max=xiao[flag].age; 77 max_i=flag; 78 } 79 } 80 if(laibin[i].age<max_m) 81 { 82 max_m=laibin[i].age; 83 max_m_i=i; 84 } 85 } 86 printf("%d\n",count); 87 if(count==0) 88 printf("%s\n",laibin[max_m_i].a); 89 else 90 printf("%s\n",xiao[max_i].a); 91 return 0; 92 }