PAT (Basic Level) Practice (中文) 1028 人口普查 (20 分)

1028 人口普查 (20 分)

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入格式:

输入在第一行给出正整数 N,取值在(0,10​5​​];随后 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

思路:注意特判合理人数为0的情况。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node{
	   char name[109];
	   int yy,mm,dd;
}a[100009];
int cmp( struct Node a ,struct Node b ){
	if ( a.yy != b.yy ){
		 return a.yy < b.yy;
	}
	if(  a.mm != b.mm ){
		 return a.mm <b.mm;
	}
	return a.dd < b.dd;
}
bool check( int yy ,int mm ,int dd ){
	 if(  yy< 1814    )
	      return false;
	 else if( yy == 1814 ){
	 	  if( mm < 9 ){
	 	 	 return false;
		  }
		  else if( mm == 9 ){
		 	   if( dd <6 ){
		 	  	   return false;
			   }
		 } 
	 }
	 
	 else  if(   yy > 2014  )
	       return false;
  	 else  if(   yy ==2014 ){
	 	 if( mm >9 ){
	 	 	 return false;
		  }
	 	 else if( mm == 9 ){
	 	 	  if( dd >6 ){
	 	 	  	  return false;
		   	  }
		  }
	 }
	 return true;
}
int main(void){
	
	int n;
	while(  scanf("%d",&n)!=EOF){
		    int ans = 0,yy,mm,dd;
		    char name[109];
			for( int i=0;i<n;i++){
				 scanf("%s",name);
				 scanf("%d",&yy);
				 getchar();
				 scanf("%d",&mm);
				 getchar();
				 scanf("%d",&dd);
			     if( check(yy,mm,dd) ){
				     strcpy(a[ans].name,name);
				     a[ans].yy = yy;
				     a[ans].mm = mm;
				     a[ans].dd = dd;
				     ans++;
			     }
			}
			sort(a,a+ans,cmp);
			if(  ans ==0 ){ 
	             printf("0\n");
			}
			else printf("%d %s %s",ans,a[0].name,a[ans-1].name);
	
	}
	
	
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/S_999999/article/details/94733990