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 }

 

 
posted @ 2020-11-26 23:40  罪梦者  阅读(217)  评论(0)    收藏  举报