某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入格式:
输入在第一行给出正整数 N,取值在(0,105];随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按 yyyy/mm/dd
(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。
输出格式:
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
输入样例:
5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20
输出样例:
3 Tom John
思路:我这里相当于是枚举的写法,略微有点复杂,用string存出生日期写可能会更简单一点,有个坑点就是有效生日个数为0的情况......
1 #include<stdio.h>
2 #include<math.h>
3 #include<string.h>
4 #include<stdlib.h>
5 typedef struct birth
6 {
7 char name[6];
8 int year;
9 int month;
10 int day;
11 } St;
12 int main()
13 {
14 int n;
15 scanf("%d",&n);
16 St num[n];
17 int t=n;//有效生日数
18 int maxyear=-1,maxmonth=-1,maxday=-1,minyear=9999,minmonth=9999,minday=9999;
19 for(int i=0;i<n;i++)
20 {
21 scanf("%s %d/%d/%d",num[i].name,&num[i].year,&num[i].month,&num[i].day);
22 if(((num[i].year<1814)||((num[i].year==1814)&&(num[i].month<9))||((num[i].year==1814)&&(num[i].month==9)&&(num[i].day<6)))||((num[i].year>2014)||((num[i].year==2014)&&(num[i].month>9))||((num[i].year==2014)&&(num[i].month==9)&&(num[i].day>6))))
23 {
24 t--;
25 continue;
26 }
27 if(num[i].year>maxyear)
28 {
29 maxyear=num[i].year;
30 maxmonth=num[i].month;
31 maxday=num[i].day;
32 }
33 else if(num[i].year==maxyear&&num[i].month>maxmonth)
34 {
35 maxmonth=num[i].month;
36 maxday=num[i].day;
37 }
38 else if(num[i].year==maxyear&&num[i].month==maxmonth&&num[i].day>maxday)
39 {
40 maxday=num[i].day;
41 }
42 if(num[i].year<minyear)
43 {
44 minyear=num[i].year;
45 minmonth=num[i].month;
46 minday=num[i].day;
47 }
48 else if(num[i].year==minyear&&num[i].month<minmonth)
49 {
50 minmonth=num[i].month;
51 minday=num[i].day;
52 }
53 else if(num[i].year==minyear&&num[i].month==minmonth&&num[i].day<minday)
54 {
55 minday=num[i].day;
56 }
57 }
58 if(t==0)
59 printf("%d",t);
60 else
61 printf("%d ",t);
62 for(int i=0;i<n;i++)
63 {
64 if(num[i].year==minyear&&num[i].month==minmonth&&num[i].day==minday)
65 printf("%s ",num[i].name);
66 }
67 for(int i=0;i<n;i++)
68 {
69 if(num[i].year==maxyear&&num[i].month==maxmonth&&num[i].day==maxday)
70 printf("%s",num[i].name);
71 }
72 return 0;
73 }
补充用string写的解法,相比于上面的解法更简单,(果然还是string好用)......
1 #include<iostream>
2 #include<cstring>
3 #include<cmath>
4 #include<cstdio>
5 #include<algorithm>
6 #include<map>
7 #include<set>
8 #include<vector>
9 using namespace std;
10 #define ll long long
11 #define inf 99999999
12 int main()
13 {
14 string str1="2014/09/06",str2="1814/09/06";
15 string min="2014/09/06",max="1814/09/06";
16 string min_name,max_name;
17 int N;
18 scanf("%d",&N);
19 string name,date;
20 int sum=0;
21 for(int i=1;i<=N;i++)
22 {
23 cin>>name>>date;
24 if(date>=str2&&date<=str1)
25 {
26 sum++;
27 if(date<min)
28 {
29 min=date;
30 min_name=name;
31 }
32 if(date>max)
33 {
34 max=date;
35 max_name=name;
36 }
37 }
38 }
39 if(sum==0)//sum为0直接特判
40 printf("%d
",sum);
41 else
42 cout<<sum<<" "<<min_name<<" "<<max_name<<endl;
43 return 0;
44 }