某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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
1 #include<stdio.h> 2 #include<math.h> 3 #include<stdlib.h> 4 #include<string.h> 5 struct man 6 { 7 char name[10]; 8 int year; 9 int mon; 10 int day; 11 }; 12 man a[100010]; 13 14 bool ismore(man x, man y) 15 { 16 if(x.year != y.year) 17 return x.year >= y.year; 18 else if(x.mon != y.mon) 19 return x.mon >= y.mon; 20 else 21 return x.day >= y.day; 22 } 23 24 bool isless(man x, man y) 25 { 26 if(x.year != y.year) 27 return x.year <= y.year; 28 else if(x.mon != y.mon) 29 return x.mon <= y.mon; 30 else 31 return x.day <= y.day; 32 } 33 34 int main() 35 { 36 int i, n, count = 0; 37 scanf("%d", &n); 38 for(i = 0; i < n; i++) 39 { 40 scanf("%s%d/%d/%d", a[i].name, &a[i].year, &a[i].mon, &a[i].day); 41 } 42 man eldest, youngest, l, r; 43 eldest.year = r.year = 2014; 44 youngest.year = l.year = 1814; 45 eldest.mon = youngest.mon = l.mon = r.mon = 9; 46 eldest.day = youngest.day = l.day = r.day = 6; 47 for(i = 0; i < n; i++) 48 { 49 if(ismore(a[i], l) && isless(a[i], r)) 50 { 51 count++; 52 if(isless(a[i], eldest)) 53 { 54 eldest = a[i]; 55 } 56 if(ismore(a[i], youngest)) 57 { 58 youngest = a[i]; 59 } 60 } 61 } 62 if(count == 0) 63 printf("0\n"); 64 else 65 printf("%d %s %s\n", count, eldest.name, youngest.name); 66 return 0; 67 }
原文:http://www.cnblogs.com/yomman/p/4269048.html