某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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 这题改了很多次,虽然不是很难但就是有一个点过不去,边界条件不太好控制,后来换了一种思路终于通过了。 #include<cstdio> #include<iostream> using namespace std; struct s { char a[100]; int y; int m; int d; }st[100010],st1[100010]; int n,i,maxn=-1,minn=99999999,ma,mi,t,k; int main() { cin>>n; int bt; char c1,c2; for(i=1;i<=n;i++) { cin>>st[i].a >>st[i].y >>c1>>st[i].m >>c2>>st[i].d; bt=st[i].y*10000+st[i].m*100+st[i].d; if(bt>=18140906&&bt<=20140906) { t++ ; st1[k++]=st[i]; } } for(i=0;i<k;i++) { bt=st1[i].y*10000+st1[i].m*100+st1[i].d; if(bt>maxn) { maxn=bt; ma=i; } } for(i=0;i<k;i++) { bt=st1[i].y*10000+st1[i].m*100+st1[i].d; if(bt<minn) { minn=bt; mi=i; } } if(t==0) printf("0"); else printf("%d %s %s",t,st1[mi].a,st1[ma].a); return 0; }